我的应用程序是一个消耗WCF服务的C#Windows服务。当第一个“期望失败(417)”错误发生时,我将ServicePointManager.Expect100Continue
和ServicePoint.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
错误吗?我需要应用程序自动适应,无需用户操作。我忘了做什么工作?
答案 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()