HttpWebRequest同时使用POST和GET

时间:2010-11-01 18:42:44

标签: c# post redirect httpwebrequest query-string

我需要使用POST方法将用户重定向到http://www.someurl.com?id=2有可能吗?如果是,那该怎么办?

现在我已经关注并正确转发了POST数据,但它删除了?id = 2:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.someurl.com?id=2");
request.Method = WebRequestMethods.Http.Post;
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postData.Length;

using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
{
    writer.Write(postData);
}

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    Response.Write(reader.ReadToEnd());
}

我需要两个查询字符串数据的原因 - > ?id = 2和POST数据是因为我将查询字符串传递给页面,其中javascript将处理查询字符串数据,而.NET将使用通过POST方法发送的数据。我传递的POST数据可能比GET方法允许的最大字符数长,因此我不能只使用GET方法...那么,您的建议是什么?

更多信息: 我正在编写一个路由页面,它向查询字符串添加一些自定义信息,然后将所有数据(旧的和新的)进一步路由到提供的某个URL。这个页面应该能够重定向到我们的服务器以及某人的服务器,它不需要知道它来自哪里或它去哪里,它只需要保持相同的POST,GET和HEADER信息以及在此步骤收到的其他信息。

8 个答案:

答案 0 :(得分:2)

没有。将POST和GET混合在一起是没有理由的。

如果你需要使用Javascript可用的请求传入参数,只需将它们发送到服务器,让服务器在隐藏字段中吐出相关信息......

<input type="hidden" value="id=2,foo=bar" disabled="disabled" />

这很简单。

注意:禁用隐藏字段以将其从子时间POST中排除(如果有);)

答案 1 :(得分:1)

问题我认为问题可能是postData不包含id参数,因为它是通过查询字符串提供的。

发布数据位于请求正文中,查询字符串数据位于网址中。

您可能需要从request.querystring中获取id到postdata变量。

答案 2 :(得分:1)

鉴于您的问题的额外信息,您需要提交给外部来源,我认为您必须做的是处理所有数据并返回带有隐藏字段的表单。添加一些javascript以在加载后立即将该表单提交到外部URL。请注意,您不会以这种方式上传文件,但您可以正确处理POST和GET数据。

答案 3 :(得分:0)

据我所知,无法使用POST重定向。难道你不能简单地假装(内部处理,好像)请求是你要将用户重定向到的页面吗?

答案 4 :(得分:0)

我发现这个问题最接近的答案就在这里,但它对用户来说并不透明,因此对我来说不够好 - &gt; Response.Redirect with POST instead of Get?

如果有人有任何其他建议,请回复!

答案 5 :(得分:0)

尝试在POST中发送包括id的所有数据。然后,当您在C#中处理数据时,您可以读取id变量并将其写回标签中的网页:

<script type="text/javascript">
  id = <%=request_id%> 
</script>

然后确保你的javascript在完全加载onload()之后开始运行,你就可以了。

答案 6 :(得分:0)

您实际要做的是重定向POST数据。我可以问为什么?如果实际上两个页面都在您的服务器上,我看不出您为什么要这样做的原因。

您应该做的是处理脚本#1中的所有POST数据,然后重定向到类似script2.aspx?id = 234的内容,其中ID 234引用数据库中的数据。然后,您可以稍后在script2上调用它,并将所有数据转储到Javascript变量中,以供客户端使用。

无论哪种方式,关于这个过程的一些事情对我来说听起来很可疑。混合您的数据处理客户端和服务器端就像混合伏特加和牛奶。它很少运作良好。 (但是白俄罗斯人肯定很好吃!)

答案 7 :(得分:0)

实际上我通过混合Javascript和Codebehind代码实现了预期的结果。所以,我所做的是在服务器端代码中,我构建了一个完整的网页,如下所示:

    var strForm = new StringBuilder();
    strForm.Append("<form id=\"" + formId + "\" name=\"" + formId + "\" action=\"" + url + queryString +"\" method=\"POST\">");
    foreach (string key in data)
    {
        strForm.Append("<input type=\"hidden\" name=\"" + key + "\" value=\"" + data[key].Replace("\"", "&quot;") + "\">");
    }
    strForm.Append("</form>");

除了在服务器端构建的这个表单之外,我还添加了一个javascript代码,提交了我刚刚构建的表单。

    var strScript = new StringBuilder();
    strScript.Append("<script language='javascript'>");
    strScript.Append("var v" + formId + " = document." + formId + ";");
    strScript.Append("v" + formId + ".submit();");
    strScript.Append("</script>");
    strForm.Append("</form>");

所以,这个代码的作用如你所见,表单操作是一个附有查询字符串参数的URL ...但由于表单方法是POST,我们将我们添加的值作为隐藏字段提交为POST参数...所以我们最终提交POST和GET参数。

希望这个解决方案可以帮助某人=)