【问题标题】:Add post values and redirect c#添加帖子值并重定向c#
【发布时间】:2016-12-22 03:06:54
【问题描述】:

我需要发布到另一个 url / 服务器,但是我需要添加其他值,然后才能到达另一个 url / 服务器。所以我想发回我自己的服务器,将值添加到“post”,然后重定向到新的 url。

我已经进行了一些搜索,并且有几个关于在 stackoverflow 上进行类似操作的答案。包括一个我再也找不到的特别好的例子,它给出了 3 或 4 个不同的例子。 Post Method and Redirect With Some Values Without Form C# | Post Data To Url and Redirect | Post form data using HttpWebRequest

但是,它们似乎都创建了一组新的值来发布,而不是检索当前的一组发布值然后添加到它们。其中之一表示我无法使用 Response.Redirect() 发布。所以具体...

  1. 如何检索当前的“帖子”并向其中添加我自己的值。
  2. 然后我怎样才能将用户发送到具有该发布数据的另一个 URL?我希望用户在服务器上添加我自己的值后转到不同的页面。

这有可能是重复的(堆栈上的问题数量很大,这很有可能)......如果有人可以在其他地方找到答案,请告诉我。我目前正在编写代码,并将在我收到它的那一刻将其添加到问题中......今晚晚些时候。

编辑#1

    public ActionResult Index(FormCollection form)
    {
        //string[] outGoingPostValues = new string[Request.Form.AllKeys.Length + 2];

        string[] incomingPostValues = Request.Form.AllKeys;
        foreach (string t in incomingPostValues)
        {
            Response.Write(t + ": " + Request.Form[t] + "<br>");
        }

        // add in two new keys
        Response.Write("Value1: " + "value1" + "<br>");
        Response.Write("Value2: " + "value2" + "<br>");

        var url = "http://newURL.com";
        WebRequest request = WebRequest.Create(url);
        request.Method = "POST";

        return Redirect("http://someurl.com");
  }

我目前正在尝试通过重定向到我自己的视图并尝试打印出以下内容来测试它...

@{
string[] outGoingPostValues = new string[Request.Form.AllKeys.Length + 2];

string[] incomingPostValues = Response. ?????
foreach (string key in incomingPostValues)
{
    Html.Raw(key);
}  
}

【问题讨论】:

  • 你有什么服务器?经典的asp? MVC?网页接口?
  • 我正在使用 asp.net mvc。
  • 您添加的那些新值是敏感信息吗?
  • jk_xp Imran Ali 我目前无法解决这个问题,因为我们似乎无法将用户发送到另一个 url(在浏览器中)并添加了帖子数据。重定向据说不包含“发布”数据。因此,我已经为你们提供了帮助,但无论谁修改他们的答案以最准确,我都会接受我将接受答案的实际拦截器。甚至此答案stackoverflow.com/questions/4015324/http-request-with-post/… 中的所有选项似乎都返回响应或等待用户未提供的响应。希望这是正确的。

标签: c# redirect http-post


【解决方案1】:

我假设您无法控制要重定向到的应用程序。在这种情况下,我不明白为什么来自this question 的方法对您不起作用?除非您添加的值是敏感信息。

您可以执行以下操作:

  1. 从用户那里获取帖子数据。
  2. 根据需要对其进行按摩,添加所需的任何新值。
  3. 将带有按摩值的表单呈现到客户响应中。
  4. 添加 javascript sn-p,以便在加载时将表单发布到其他页面。

示例代码:

 Dictionary<string, string> postData = new Dictionary<string, string>();
 foreach (string key in Request.Form.AllKeys)
 {
        postData.Add(key, Request.Form[key]);
 }
 postData.Add("new-key", "new-value"); //add new values here.
 ViewBag.formPostData = postData;

在视图中:

@using (@Html.BeginForm(null, null, FormMethod.Post, new { @action = "http://redirect.com/", @id = "redirectForm" }))
{
    foreach (KeyValuePair<string, string> item in @ViewBag.formPostData)
    {
        @Html.Hidden(item.Key, item.Value);
    }
}


<script type="text/javascript">
    $(document).ready(function () {
        var form = $('#redirectForm');
        if (form) {
            form.submit();
        }
    })
</script>

编辑:

如果新值很敏感,恐怕没有一种简单的方法可以在不控制另一个应用的情况下完成您想要的事情。您可以使用其他答案中提到的适当发布参数在服务器端执行 HttpRequest,然后将响应呈现给用户,但他们仍会在顶部看到您的 url。来自其他站点的资源(例如图像、css 等)可能无法正常工作。而且您需要了解您的场景会创建大量 security concerns

【讨论】:

  • 我添加的字段是敏感的,所以我不能以任何方式将它们发送到视图或客户端......谢谢。:)
  • 感谢您的帮助 JK_xp。我对你所说的安全问题并不完全熟悉......我只是不明白这与我所说的有什么不同
    ?
  • 您的场景类似于CSRF。当您执行
    请求来自用户浏览器时,浏览器会发出 post 请求。当您从代码中执行 HttpRequest 时 - 请求来自您的 Web 服务器。你问的是这个吗?
  • 是的......有点没有恶意。最终,公司一直都在这样做。另一个与我之前做过的类似的场景是,当一家公司通过支付处理器
    将用户发送到托管支付页面,然后在该页面上进行授权或支付,然后用户然后将通过他们这边的配置发回给我们。这是针对不同情况的,但最终也可以使用该解决方案来提高安全性。
  • 您刚刚为支付处理器描述的场景是真实的,这些系统是专门为此设计的。用于考试的 Paypal 希望您在后端与其通信以获取交易令牌,然后您将带有该令牌的用户重定向到 Paypal 页面。用户看不到您的敏感数据(例如您的 Paypal 凭据),而只能看到令牌。因此,在您最初的问题中,我猜您也想做同样的事情-使用您的凭据对用户进行身份验证,而无需用户查看。重定向网站必须设计为支持此类场景。如果没有 - 那么这是一个问题。
【解决方案2】:

您可能需要执行How to Get the HTTP Post data in C#? 之类的操作才能从帖子中获取数据。

然后根据需要编辑数据。然后使用带有 POST 条件 (if there is authentication involved you should look into saving the cookies and sending those over too) 的 HttpResponse 或 Webclient 将数据发送到新网站。您的消息来源似乎向您展示了如何做到这一点。

查看您的编辑,您似乎忘了做一些事情,所以这里是一些示例代码:

        WebRequest request = WebRequest.Create ("http://www.contoso.com/PostAccepter.aspx ");

        // Set the Method property of the request to POST.
        request.Method = "POST";

        // Create POST data and convert it to a byte array.
        string postData = "This is a test that posts this string to a Web server.";

        byte[] byteArray = Encoding.UTF8.GetBytes (postData);

        // Set the ContentType property of the WebRequest.
        request.ContentType = "application/x-www-form-urlencoded";

        // Set the ContentLength property of the WebRequest.
        request.ContentLength = byteArray.Length;
        // Get the request stream.
        Stream dataStream = request.GetRequestStream ();

        // Write the data to the request stream.
        dataStream.Write (byteArray, 0, byteArray.Length);

        // Close the Stream object.
        dataStream.Close ();

取自How to: Send Data Using the WebRequest Class

【讨论】:

  • Web 客户端或 httpResponse 会将控制权转移给用户吗?我基本上想说“带着这些额外的数据把用户带到这里。
  • 查看How to: Redirect Users to Another Page 这应该会重定向您的用户。
  • 嗯好吧,你在寻找类似this 的东西吗??
  • 好吧,深入研究一下,this 答案似乎建议您可以使用 Response.Redirect()。
  • 正在看...这表明我可以“等待回复”但是我等不及了,因为我需要用户在该页面上采取行动。所以我无法重定向成功的响应,因为我必须将用户发送到那里以创建该响应。感谢您的帮助伊姆兰。我认为 JK 是正确的,我在多个不同的答案中看到了它,我无法在重定向中发布,因为根据定义,重定向不包含“发布”数据。我会认为会有某种方法可以从响应对象派生以允许代码执行然后包含额外的值。唉...
猜你喜欢
  • 2016-05-24
  • 1970-01-01
  • 2011-03-02
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
相关资源
最近更新 更多