我有一个自定义的Http Handler来操作HTTP POST和GET。我让项目工作在一个单独的孤立服务器上,现在需要把它投入生产......
using (var client = new WebClient())
{
client.Credentials = CredentialCache.DefaultCredentials;
client.UploadFile("serverlocation:port", fileToUpload);
}
由于某些原因,现在使用client.UploadFile("", file);
,即强制HTTP POST
System.Net.WebException: The remote server returned an error: (417) Expectation failed.
at System.Net.WebClient.UploadFile(Uri address, String method, String fileName)
这可能是什么?我知道代码有效,还有什么呢?也许服务器会阻止HTTP POST请求?
我尝试过添加:
ServicePointManager.Expect100Continue = false;
但是没有成功,虽然我不是100%确定此代码之前的位置,我假设在我使用WebClient之前
编辑0:
我只有read以下内容:
由于存在较旧的实现,协议允许 客户可能发送的模糊情况“Expect:100- 继续“没有收到417(期望失败)状态 或100(继续)状态。因此,当客户端发送此消息时 标头字段到原始服务器(可能通过代理)从中 从未见过100(继续)状态,客户端不应该等待 在发送请求正文之前无限期。
我认为此请求是通过代理进行的,这可能与问题有关。
修改1:
相信这个问题必须是100-continue,因为使用fiddler来查看我的应用程序使用WebClient.UploadFile
发送的确切内容显示了这一点:
POST http://XXX.XXX.XXX.XXX:8091/file.myhandledextension HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------8ccd1eb03f78bc2
Host: XXX.XXX.XXX.XXX:8091
Content-Length: 4492
Expect: 100-continue
尽管在using语句之前放了那行:ServicePointManager.Expect100Continue = false;
。我不认为这条线确实有用。
答案 0 :(得分:3)
我最终通过将ServicePointManager.Expect100Continue = false;
放在调用WebClient类的构造函数中来解决这个问题。
然后我使用Fiddler检查POST请求,以确保Expect: 100-continue
不再出现在请求中。