0

我的应用程序是使用 WCF 服务的 C# Windows 服务。当出现第一个“期望失败 (417)”错误时,我将ServicePointManager.Expect100Continue和都更改ServicePoint.Expect100Continuefalse

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
    }
}

但是,对该服务的第二次调用也失败了。但是,如果我在任何连接之前设置Expect100Continuefalse,与服务的通信就可以正常工作。

这种方式正确处理Expect100Continue错误吗?我需要应用程序自动适应而无需用户操作。我忘记做这项工作是什么?

4

2 回答 2

1

大多数设置ServicePointManager都被视为应用在应用程序生命中该点之后创建的所有新服务点的默认值。在看到错误后更改设置的情况下,您实际上并没有更改现有 ServicePoint 实例上的任何内容,包括在这种情况下与 WCF 使用的连接关联的实例。

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

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

于 2012-09-17T18:23:58.620 回答
0

从ServicePointManager.Expect100Continue的MSDN文档中,

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

于 2013-02-05T17:21:07.583 回答