C#WSDL客户端请求包

时间:2015-01-27 09:14:03

标签: c# http soap wsdl wireshark

我目前正在使用“添加服务引用”向我的项目添加SOAP-WSDL服务。它创建了所有必要的类和函数供我调用。其中一些功能没有给我回应。延迟1分钟后,我收到超时异常。然而,当我使用Postman(用于发出网络请求的chrome扩展)伪造请求时,它会得到完整的响应。我怀疑并开始使用Wireshark检查网络。经过检查,我发现问题出现了。但我不能让他们解决这个问题。所以我需要使用C#模仿Postman请求。

我和邮递员之间的主要区别是,Postman在单个请求中发布所有必要的数据以获得响应,但是我的客户端帖子只是http标头等待Http Continue并继续发送必要的数据。我猜这打破了服务。

以下是Postman和我的客户的wireshark截图

(邮递员位于图片左侧,右边是我的.net客户端 - 抱歉我的完美涂装技巧)

postman vs C# client

使用basicHttpBinding在.net wsdl客户端上是否有任何配置我可以配置为单个请求呼叫?

编辑:当我进一步调查我的C#客户端时,我看到.net http层发送一个初始POST并说(Expect:100 Continue),收到后继续继续发送SOAP Envelope

edit2:我改变了我的代码以使用HttpWebRequest发出请求,但.net仍然发送带有单独请求的标题和帖子正文(即使我禁用了Expect:100 Continue),并且在我的理论中这打破了服务。

问题2:无论如何要说HttpWebRequest,不要拆分头和身体?在单个请求中发送所有这些?

edit3:我解决了这个问题。但它不是大约100继续。因缺少用户代理标题而导致服务被破坏

2 个答案:

答案 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>