Correcty处理Expectation失败(417)并在WCF客户端应用程序中更改Expect100Continue

时间:2012-09-17 16:21:02

标签: c# wcf windows-services http-headers

我的应用程序是一个消耗WCF服务的C#Windows服务。当第一个“期望失败(417)”错误发生时,我将ServicePointManager.Expect100ContinueServicePoint.Expect100Continue都更改为false

try
{
    //ServicePointManager.Expect100Continue = false; // If uncomment all work
    var svc = new ServiceClient();
    svc.GetData(); // first error
}
catch (ProtocolException pex)
{
    if (pex.Message.Contains("(417)"))
    {
        ServicePointManager.Expect100Continue = false;
        var sp = ServicePointManager.FindServicePoint(new Uri(@"http://addr.to.service/service.svc"));
        sp.Expect100Continue = false;

        var svc = new ServiceClient();
        svc.GetData(); // second same error
    }
}

然而,对服务的第二次调用也失败了。但是,如果我在任何连接之前将Expect100Continue设置为false,则与服务的通信可以正常工作。

这样可以正确处理Expect100Continue错误吗?我需要应用程序自动适应,无需用户操作。我忘了做什么工作?

2 个答案:

答案 0 :(得分:1)

ServicePointManager上的大多数设置都被视为在应用程序生命周期中创建的所有新ServicePoints上应用的默认值。如果在看到错误后更改设置,则实际上并未更改现有ServicePoint实例上的任何内容,包括与此情况下WCF使用的连接关联的实例。

在您的示例代码中,您正在调用ServicePointManager.FindServicePoint以尝试查找正确的ServicePoint。但是,FindServicePoint有几个重载,并且很容易错误地使用该API。例如,FindServicePoint会尝试考虑http / https,您要连接的主机,代理配置等。如果您没有向FindServicePoint提供正确的参数,您可以轻松最终将错误的ServicePoint返回给您,您的设置将不会应用于您要更改的ServicePoint

我建议您使用FindServicePoint重载,IWebProxy object以确保您获得正确的ServicePoint。在大多数情况下,您应该能够将WebRequest.DefaultWebProxy作为IWebProxy对象传递。

答案 1 :(得分:0)

来自ServicePointManager.Expect100Continue的MSDN文档,

更改此属性的值不会影响现有的ServicePoint对象。只有在更改后创建的新ServicePoint对象才会受到影响。因此,更改现有WCF客户端上的值将不起作用。您需要创建一个新的WCF客户端,然后调用GetData()