C# WSDL 客户端请求包

C# WSDL Client Request Packages

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

我的和 postman 之间的主要区别是,邮递员 post 将所有必要的数据都放在一个响应请求中,但我的客户端 post 只是 http headers 等待 Http Continue 并继续发送必要的数据。我想这会破坏服务。

这是 Postman 和我的客户的 wireshark 截图

(邮递员在图片的左侧,右侧是我的 .net 客户端 - 对不起,我完美的绘画技巧)

在 .net wsdl 客户端上是否有任何我可以配置为发出单个调用请求的 basicHttpBinding 配置?

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

edit2:我更改了我的代码以使用 HttpWebRequest 发出请求,但是 .net 仍然发送 header 和 post body 单独的请求(即使我禁用了 Expect: 100 Continue ) 并且在我看来这会中断服务。

问题2:反正有没有说HttpWebRequest,不要拆分header和body?在一个请求中发送所有这些?

edit3:我解决了这个问题。但它不是大约 100 继续。服务因丢失 User-Agent Header

而中断

对于 HttpWebRequest,您可以将以下内容添加到您的 .config 文件中 - 我们在我们的服务中使用它。但是,我不确定它如何影响 WCF 通道。

<configuration>
  <system.net>
    <settings>
      <servicePointManager expect100Continue="false" />
    </settings>
  </system.net>
</configuration>

我终于解决了这个问题。经过长时间的检查和尝试后,我发现如果不添加 User-Agent HTTP Header,远程服务会在数据通信过程中停止响应。所以我在每个请求之前使用 IClientMessageInspector 添加了 http header

这里是 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;
    }