添加帖子值并重定向c#

时间:2016-08-15 21:05:49

标签: c# redirect http-post

我需要发布到另一个url / server,但是我需要在转到其他url / server之前添加其他值。所以我想回发给自己的服务器,将值添加到“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

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

  1. 如何检索当前的“帖子”并将自己的值添加到其中。
  2. 如何将用户发送到包含该发布数据的其他网址?我希望用户在服务器上添加自己的值后转到其他页面。
  3. 这有可能是重复的(堆栈问题的重要性很可能)...如果有人能在其他地方找到答案,请告诉我。我目前正在编写代码,并且会在我得到它的那一刻将其添加到...今晚稍后。

    编辑#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);
    }  
    }
    

2 个答案:

答案 0 :(得分:2)

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

您可以执行以下操作:

  1. 从用户处获取发布数据。
  2. 根据需要按摩它,添加您需要的任何新值。
  3. 将带有按摩值的表单呈现给客户响应。
  4. 添加将在加载时将表单发布到其他页面的javascript片段。
  5. 示例代码:

     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>
    

    修改

    如果新值是敏感的,我恐怕没有一种简单的方法可以实现你想要的,而无法控制另一个应用程序。你可以在服务器端使用其他答案中提到的相应的post参数执行HttpRequest,然后将响应呈现给用户,但是他们仍会在顶部看到你的url。来自其他站点的资源(如图像,CSS等)可能无法正常工作。您需要了解您的方案创建了大量security concerns

答案 1 :(得分:1)

您可能需要执行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