4

我有一个自定义的 Http Handler 来操作 HTTP POST 和 GET。我让项目在单独的隔离服务器上工作,现在需要将其投入生产......

using (var client = new WebClient())
                {
                    client.Credentials = CredentialCache.DefaultCredentials;
                    client.UploadFile("serverlocation:port", fileToUpload);
                }

由于某种原因,现在使用client.UploadFile("", file);ie 强制 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:

我刚刚阅读了以下内容:

由于存在较旧的实现,该协议允许客户端可能发送“期望: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 语句之前。我不认为这条线实际上有效。

4

1 回答 1

3

我最终通过将ServicePointManager.Expect100Continue = false;调用 WebClient 类的构造函数放入来解决这个问题。

然后我使用Fiddler检查 POST 请求以确保Expect: 100-continue不再在请求中。

于 2010-06-04T02:03:26.223 回答