我目前正在使用“添加服务引用”向我的项目添加SOAP-WSDL服务。它创建了所有必要的类和函数供我调用。其中一些功能没有给我回应。延迟1分钟后,我收到超时异常。然而,当我使用Postman(用于发出网络请求的chrome扩展)伪造请求时,它会得到完整的响应。我怀疑并开始使用Wireshark检查网络。经过检查,我发现问题出现了。但我不能让他们解决这个问题。所以我需要使用C#模仿Postman请求。
我和邮递员之间的主要区别是,Postman在单个请求中发布所有必要的数据以获得响应,但是我的客户端帖子只是http标头等待Http Continue并继续发送必要的数据。我猜这打破了服务。
以下是Postman和我的客户的wireshark截图
(邮递员位于图片左侧,右边是我的.net客户端 - 抱歉我的完美涂装技巧)
使用basicHttpBinding在.net wsdl客户端上是否有任何配置我可以配置为单个请求呼叫?
编辑:当我进一步调查我的C#客户端时,我看到.net http层发送一个初始POST并说(Expect:100 Continue),收到后继续继续发送SOAP Envelope
edit2:我改变了我的代码以使用HttpWebRequest发出请求,但.net仍然发送带有单独请求的标题和帖子正文(即使我禁用了Expect:100 Continue),并且在我的理论中这打破了服务。
问题2:无论如何要说HttpWebRequest,不要拆分头和身体?在单个请求中发送所有这些?edit3:我解决了这个问题。但它不是大约100继续。因缺少用户代理标题而导致服务被破坏
答案 0 :(得分:1)
我终于解决了这个问题。经过长时间的检查和尝试后,如果我不添加User-Agent HTTP Header,我看到远程服务在数据通信中间停止响应。所以我在每个请求之前使用IClientMessageInspector添加了http标头
如果有人需要,这里是wcf代码
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
HttpRequestMessageProperty realProp;
object property;
//check if this property already exists
if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out property))
{
realProp = (HttpRequestMessageProperty) property;
if (string.IsNullOrEmpty(realProp.Headers["User-Agent"])) //don't modify if it is already set
{
realProp.Headers["User-Agent"] = "doktorinSM/2.1";
}
return null;
}
realProp = new HttpRequestMessageProperty();
realProp.Headers["User-Agent"] = "doktorinSM/2.1";
request.Properties.Add(HttpRequestMessageProperty.Name, realProp);
return null;
}
答案 1 :(得分:0)
对于HttpWebRequest,您可以将以下内容添加到.config文件中 - 我们在服务上使用它。但是,我不确定它如何影响WCF频道。
<configuration>
<system.net>
<settings>
<servicePointManager expect100Continue="false" />
</settings>
</system.net>
</configuration>