我有一个自定义的 Http Handler 来操作 HTTP POST 和 GET。我让项目在单独的隔离服务器上工作,现在需要将其投入生产......
using (var client = new WebClient())
{
client.Credentials = CredentialCache.DefaultCredentials;
client.UploadFile("serverlocation:port", fileToUpload);
}
由于某些原因,现在使用
client.UploadFile("", file);
即强制 HTTP POSTSystem.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以下:
由于存在较旧的实现,该协议(protocol)允许
客户可能会发送“期望: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
尽管放了那条线:
ServicePointManager.Expect100Continue = false;
在 using 语句之前。我不认为这条线实际上有效。
最佳答案
我最终通过放置 ServicePointManager.Expect100Continue = false;
解决了这个问题。在调用 WebClient 类的构造函数中。
然后我用了Fiddler检查 POST 请求以确保 Expect: 100-continue
不再在请求中。
关于visual-studio - 网络客户端问题 : Expectation failed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2970641/