C#.NET 中带有部分 URL 的 Http Post
Posted
技术标签:
【中文标题】C#.NET 中带有部分 URL 的 Http Post【英文标题】:Http Post with Partial URL in C#.NET 【发布时间】:2012-04-19 05:41:02 【问题描述】:我有一个 Web 应用程序(我无法控制它),我需要以编程方式向其发送 HTTP 帖子。目前我正在使用 HttpWebRequest 之类的
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://someserver.com/blah/blah.aspx");
但是,应用程序在发布到数据时返回“未知服务器错误(不是 IIS 错误,自定义应用程序错误页面)”。使用 Fiddler 比较我的 Post 与 IE 帖子,我可以看到唯一的区别在于请求的 POST 行:
在 Internet Explorer Fiddler(RAW 视图)中显示流量
POST /blah/blah.aspx HTTP/1.1
在我的 C# 程序中,fiddler(RAW 视图)将流量记录为
POST https://someserver.com/blah/blah.aspxHTTP/1.1
这只是两个请求的区别。
从我目前的研究来看,似乎没有办法让 HttpWebRequest.Create 发布相对 URL。注意:我看到很多关于“如何使用相对 URL”的帖子,但这些建议不起作用,因为实际发布仍然使用绝对 URL(当您嗅探 HTTP 流量时)
用相对 URL 完成这篇文章的最简单方法是什么?
(流量不通过代理)
更新:目前我正在使用 IE 自动化来进行预定的性能测试,而不是上面的方法。我可能会考虑另一种脚本语言,因为我确实想在没有任何浏览器的情况下进行测试。
【问题讨论】:
Fiddler 的 RAW 视图总是在请求行中显示协议和主机,无论它们是否包含在那里。如果客户知道他们正在与代理(如 Fiddler)而不是在加密隧道内交谈,他们应该总是在请求行中发送这些。请求之间一定存在其他差异。 【参考方案1】:不,如果 URL 中没有服务器,您将无法进行 POST。
您的程序失败的一个可能原因是它没有使用正确的代理,因此无法解析服务器名称。
注意:Fiddler 在你所说的视图中分别显示路径和主机。
将您的程序配置为使用 Fiddler 作为代理 (127.0.0.1:8888) 并将您发出的请求与浏览器的请求进行比较。不要忘记将 Fiddler 切换为“显示所有进程”。
这里是关于为不同类型的环境(包括 C# 代码)配置 Fiddler 的文章:Fiddler: Configuring clients
objRequest = (HttpWebRequest)WebRequest.Create(url);
objRequest.Proxy= new WebProxy("127.0.0.1", 8888);
【讨论】:
感谢您的回复。我提供的详细信息来自 Fiddler RAW 视图。通过 IE 加载页面时,“POST”不会在“原始”视图中使用完整 URL。我的代码适用于同一站点上的其他几个页面,因此代理不是问题。我还做了几个成功的“POST”,服务器上只有一个页面(我无法控制)只接受带有相对 URL 的 POST(因为 IE 提交它)虽然 WebRequest 似乎无法做到这一点,但我正在寻找对于替代方法。看来如果我使用 .NET,我将不得不创建 HTTP 请求w/o WebRequest(并且是 HTTPS) 所以基本上我需要以某种方式使用相对 URL 发布到 HTTPS。目前我无法在.NET中找到它,我可能会寻找替代脚本语言,我只需要在加载一些页面/发布到表单时运行预定的性能测试,并且我需要能够部署它来运行在 XP&Win7 机器上,最好不需要安装任何软件。 不知道。更随机的尝试:请求始终包含服务器 - 检查视图中存在的“主机:XXXXXX”标头以获取来自浏览器的请求。检查浏览器是否发出 HTTPS 请求,检查您是否可以从您的代码中发布/获取其他 HTTPS 页面。使用 Fiddler - 尝试破解您的程序请求以在“Composer”视图中工作 - 查看导致请求失败的部分。以上是关于C#.NET 中带有部分 URL 的 Http Post的主要内容,如果未能解决你的问题,请参考以下文章