Web客户端和Expect100Continue

9
使用WebClient(C#.NET)时,如何设置expect100continue最佳方式?我有以下代码,但在头部仍然看到100 continue。愚蠢的Apache仍然抱怨505错误。
        string url = "http://aaaa.com";
        ServicePointManager.Expect100Continue = false;

        WebClient service = new WebClient();           
        service.Credentials = new NetworkCredential("username", "password");
        service.Headers.Add("Content-Type","text/xml");

        service.UploadStringCompleted += (sender, e) => CompleteCallback(BuildResponse(e));
        service.UploadStringAsync(new Uri(url), "POST", query);

注意:如果我将上述内容放在控制台应用程序中并让其运行-那么我在Fiddler中看不到标题。但是,我的代码嵌入在由WPF应用程序加载的用户库中。因此,关于Expect100Continue还有更多的线程、初始化等方面的问题。现在,我认为这更多是我的代码问题。
5个回答

8

您需要在访问URI的ServicePoint上设置Expect100Continue属性:

var uri = new Uri("http://foo.bar.baz");
var servicePoint = ServicePointManager.FindServicePoint(uri);
servicePoint.Expect100Continue = false;

4
唯一的方法是创建一个覆盖。
   public class ExpectContinueAware : System.Net.WebClient
    {
        protected override System.Net.WebRequest GetWebRequest(Uri address)
        {
            System.Net.WebRequest request = base.GetWebRequest(address);
            if (request is System.Net.HttpWebRequest)
            {
                var hwr = request as System.Net.HttpWebRequest;
                hwr.ServicePoint.Expect100Continue = false;
            }
            return request;
        }
    }

这很完美地运作。


1
这应该是被接受的答案。只有这种方法允许在每个请求的基础上设置Expect100Continue。 - Steve B

2
尝试在将Expect100Continue更改为false后创建WebClient实例。或者使用Webrequest而不是WebClient。

1

我的以下方法之一也起作用了,

在我的类构造函数中(服务调用),您可以设置System.Net.ServicePointManager.Expect100Continue = false;

然后我创建了BasicHttpBinding对象并继续执行,它成功地执行了。


0

您可以通过添加以下内容来修改您的Web/App.Config文件:

<system.net>
  <settings>
    <servicePointManager expect100Continue="false"/>
  </settings>
</system.net>

至少对我来说,如果有故障的服务器得到修补,我可以轻松地删除设置而无需重新编译。


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