通过Fiddler向asp.net mvc操作发送POST请求

25

我有一个 ASP.NET MVC 网站。其中一个路由是一个带有 5 个参数的 URL。为了举例说明,这些参数分别命名为 parameter1parameter2parameter3parameter4parameter5。目前,我正在一些 C# 代码中构建一个 URL,该 URL 将通过 WebClient 进行 POST 到 mvc 操作。该代码如下:

WebClient myWebClient = new WebClient();
myWebClient.UploadStringCompleted += myWebClient_UploadStringCompleted;

string url = "http://www.example.com/customer/" + parameter1 + "/orders/" + parameter2 + "/" + parameter3 + "/" + parameter4 + "/" + parameter5;
myWebClient.UploadStringAsync(new Uri(url, UriKind.Absolute));

我相信UploadString方法执行的是一个POST请求。我需要执行POST请求,因为我的参数值可能非常长。事实上,我估计有时候总的url长度可能会达到20000个字符。不管怎样,当我尝试发送数据时,我得到了400错误。为了调试这个问题,我正在尝试找出如何在Fiddler中模拟一个POST请求。

假设我正在通过上面显示的查询字符串传递参数值,我应该输入什么值到Fiddler中?从Composer选项卡中,我不确定要在Request Headers区域中输入什么。我也不完全确定要在URL中输入什么。我不知道是否应该把整个URL,包括参数值都放在URL中,还是将其放在Request Headers中。

我需要输入什么值到Fiddler中,以便调试我的问题?


为什么不编写一个微小的C#客户端来进行POST请求呢?尽管我只了解Fiddler的基础知识。 - Jonesopolis
你在问题中展示的UploadStringAsync没有这样的重载。你在哪里传递了这个POST请求的实际负载?此外,你似乎在问题中提到了一些查询字符串参数,但实际上并没有这样的参数。你的参数似乎是作为URL路径的一部分传递的。 - Darin Dimitrov
1
为了调试这个问题,我正在尝试在Fiddler中模拟POST请求。或者你可以让服务器记录错误并检查它。或者检查你的应用程序发出的请求。 - CodeCaster
2个回答

47

基本上你的所有参数都是URL的一部分,这是问题的根源。具体情况是:你超出了URL长度限制,服务器返回了"400 Bad request"错误。在现实世界中,大多数Web浏览器无法处理超过2000个字符的URL。

为了解决这个问题,我建议重新设计一下,将请求发送到URL http://www.example.com/customer/parameter1/orders 或者甚至是 http://www.example.com/customer/orders,并将参数放在请求体中发送。以下是如何在Fiddler中测试此类请求:

  1. Composer标签上选择POST请求动词
  2. 将URL指定为http://www.example.com/customer/parameter1/ordershttp://www.example.com/customer/orders
  3. Request Headers部分,可以设置内容类型头,例如:
Content-Type: application/x-www-form-urlencoded
  • 或者您需要的任何其他标头。或者只需将其留空,在您的情况下这将起作用。

  • 最后,在请求正文字段中以查询字符串形式列出您的参数。

  • parameter1name=parameter1value&parameter2name=parameter2value
    
    在这个新的案例中,您可以使用WebClient发送此类请求的方法如下:

    WebClient myWebClient = new WebClient();
    myWebClient.UploadStringCompleted += myWebClient_UploadStringCompleted;
    
    string url = "http://www.example.com/customer/orders";
    string data = "parameter1name=parameter1value&parameter2name=parameter2value";
    
    myWebClient.UploadStringAsync(new Uri(url, UriKind.Absolute), data);
    

    那么我该如何更新我的WebClient代码,以便按照您展示的格式传递这些信息呢? - Eels Fan
    @EelsFan,WebClient.UploadStringAsync有一种重载,可以接受查询字符串形式的参数。请参见更新。 - Andrei
    我看到了更新,现在我在想是否需要更新我的路由。我的路由目前是:routes.MapRoute( name: "OrderInfo", url: "customer/{parameter1}/orders/{parameter2}/{parameter3}/{parameter4}/{parameter5}", defaults: new { controller = "Customer", action = "CustomerOrder" } ); - Eels Fan
    @EelsFan,是的,它也需要一些更新。从中删除参数,因为它们不再是URL的一部分。但是将它们作为操作方法的参数保留- ASP.NET MVC仍然能够将请求体映射到操作参数。 - Andrei
    请不要忘记更改HTTP/1.1。 - Yohanim

    6
    我只是模仿发送的确切请求。
    我是这样做的:
    1. 打开 Fiddler
    2. 转到我想要重新发出命令的页面,即重复错误步骤,但在列表中观察请求
    3. 从列表中选择它,右键单击,转到“重放”>“重新发出并编辑”
    4. 这会构建一个复制的请求,但在发送之前命中断点(您将在右侧看到红色条)
    5. 在此之上,您可以通过在 Headers、QueryString 等中双击任何值来编辑已发送的值。
    6. 然后点击“运行以完成”

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接