如何解决WCF:远程服务器返回错误:“417期望失败”
我们正在尝试从使用 NET Core 3.1 制作的后端服务连接到旧的 WCF 服务。为此,我们使用两个 NuGet 包“System.ServiceModel.Http”和“System.ServiceModel.Primitives”(最新版本 4.8.1)。
为了连接到端点,我们创建了如下的绑定/服务客户端手册
var binding = new BasicHttpsBinding();
binding.Security.Mode = BasicHttpsSecurityMode.Transport;
binding.Security.Transport = new HttpTransportSecurity() { ClientCredentialType = HttpClientCredentialType.Certificate,ProxyCredentialType = HttpProxyCredentialType.Basic };
binding.CloseTimeout = new TimeSpan(0,12,0);
binding.OpenTimeout = new TimeSpan(0,0);
binding.SendTimeout = new TimeSpan(0,0);
binding.MaxReceivedMessageSize = 2147483646;
binding.MaxBufferSize = 2147483646;
var channelfactory = new SearchServiceClient(binding,endpoint);
channelfactory.ClientCredentials.ClientCertificate.SetCertificate(System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser,System.Security.Cryptography.X509Certificates.StoreName.My,System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName,"CERTIFICATENAME");
var response = await channelfactory.existsAsync(...);
为了建立连接,我们需要使用 SSL 客户端证书,而不是用户名/密码。
对于每个请求,我们都会收到以下错误消息:“远程服务器返回错误:(417) 预期失败”。
我做了一些研究,发现您需要做的就是将“ExpectContinue”标志设置为 false。
不幸的是,这不能通过 ServicePointManager 工作(甚至在 web.config 中也不能)。
ServicePointManager.Expect100Continue = false;
如果我将“System.ServiceModel.Http”和“System.ServiceModel.Primitives”的 nuget 包版本降级到 4.4.4,它就可以工作。
有谁知道我如何用最新版本做到这一点?
解决方法
经过几周的研究,我现在可以找到解决方案。
-
创建自定义的 MessageHandlerBehavior 和 DelegatingHandler(请看https://justsimplycode.com/2019/11/02/disable-header-100-continue-in-net-core-wcf-client/)
-
使用自定义 MessageHandlerBehavior 并将 ExpectContinue 设置为 false:
var handlerFactoryBehavior = new HttpMessageHandlerBehavior(); handlerFactoryBehavior.OnSending = (message,token) => { message.Headers.ExpectContinue = false; return null; }; var channelfactory = new SearchServiceClient(binding,endpoint); channelfactory.ClientCredentials.ClientCertificate.SetCertificate(...); channelfactory.Endpoint.EndpointBehaviors.Add(handlerFactoryBehavior);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。