WCF客户端消息格式c#

时间:2018-01-05 03:49:43

标签: c# web-services wcf soap client

我正在创建一个使用WCF Web服务的应用程序。当我在SOAP UI中测试某个操作时,它可以工作,但是,当我在VS2017控制台应用程序中测试时,我收到一个错误:

“响应消息的内容类型text / html; charset = UTF-8与绑定的内容类型不匹配”

我使用Fiddler从我的控制台应用程序中获取请求,并且我已将问题缩小到SOAP请求中的某些格式。当我格式化我的控制台应用程序请求以匹配Fiddler生成的请求时,它可以工作。在我的请求中有一些默认的前缀似乎导致了这个问题,以及xmlns声明。我需要知道如何修改请求的这些部分以符合我完全无法控制的Web服务(大公司)。

前缀sh需要更改为不同的值。我接受了这个请求并将其放入SOAP UI,整个交换sh以匹配Fiddler在请求中传递的方式,并且它可以正常工作。我还必须将xmlns:h移动到信封级别。我可以在配置文件中更改一些内容吗?我可以轻松实现消息合约吗?我需要能够正确格式化,但我不确定最好的方法是什么。

坏:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:FooListHeader xmlns:h="http://foo.foo.com/Hello" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <h:FooList>
        <h:FooStatement>
          <h:Title>Foo</h:Title>
          <h:Value>123</h:Value>
        </h:FooStatement>
      </h:FooList>
    </h:FooListHeader>
  </s:Header>
  <s:Body>
    <GetFooRequestType xmlns="http://foo.foo.com/Hello">
      <MessageRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <ConFooRequest/>
      </MessageRequest>
    </GetFooRequestType>
  </s:Body>
</s:Envelope>

GOOD(我怎样才能将上面的错误示例转换为我的应用程序中的这个好示例?):

<soapenv:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:foo="http://foo.foo.com/Hello">
  <soapenv:Header>
    <foo:FooListHeader xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <foo:FooList>
        <foo:FooStatement>
          <foo:Title>Foo</foo:Title>
          <foo:Value>123</foo:Value>
        </foo:FooStatement>
      </foo:FooList>
    </foo:FooListHeader>
  </soapenv:Header>
  <soapenv:Body>
    <foo:GetFooRequestType xmlns="http://foo.foo.com/Hello">
      <foo:MessageRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <foo:ConFooRequest/>
      </foo:MessageRequest>
    </foo:GetFooRequestType>
  </soapenv:Body>
</soapenv:Envelope>

Service Reference Image

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="foo" />
            </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://Foo.foo.com/foo/foows.svc"       
          binding="basicHttpBinding" bindingConfiguration="foo"
          contract="Service1Reference.IFooServices" name="foo" />
        </client>
    </system.serviceModel>
</configuration>

我在互联网上可以找到关于这个主题的一切主要围绕事物的服务方面,而不是客户方。

该公司为我提供了.wsdl文件和XML参考文件。我不太确定如何处理参考文件,但是我已经在我的应用程序中的“添加服务引用”下直接加载了.wsdl文件。我无法发现使用端点的服务,就像我以前在我工作过的项目中所做的那样,所以我必须在我的PC上本地存储文件,并在添加服务引用时直接指定它的路径。同样,出于安全考虑,我无法使用典型的?wsdl地址发现服务,这很可能是由于服务配置设置所致。非常感谢任何回复!

0 个答案:

没有答案