方法参数

时间:2018-02-23 11:08:22

标签: c# wcf soap namespaces

我遇到了用C#编写的webservice的问题。它工作正常,直到我想调用带参数的方法,使用我的wsdl从外部供应商生成的SOAP请求如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://127.0.0.1/AService</To>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">ANameSpace/login</Action>
  </s:Header>
  <soapenv:Body>
    <ns1:login soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="ANameSpace">
      <a_sDMSUserName xsi:type="xsd:string">test</a_sDMSUserName>
      <a_sDMSUserPassword xsi:type="xsd:string">oscar</a_sDMSUserPassword>
    </ns1:login>
  </soapenv:Body>
</soapenv:Envelope>

这是我服务界面的一部分:

[ServiceContract (Namespace ="ANameSpace")]
    public interface IFordEcat
    {
        [OperationContract (Action ="ANameSpace/connect")]
        int connect();

        [OperationContract(Action = "ANameSpace/disconnect")]
        int disconnect();

        [OperationContract(Action = "ANameSpace/login")]
        string login(string a_sDMSUserName, string a_sDMSUserPassword);

        [OperationContract(Action = "ANameSpace/logout")]
        string logout(string a_sSessionID, string a_sDMSUserName, string a_sDMSUserPassword);

使用SoapUI或通过服务引用在C#中设置测试客户端,它可以正常工作。

唯一的问题是login Method或带参数的任何其他Method的参数缺少传递参数的节点中的名称空间前缀(nsl)。当我手动添加它们时,例如在SOAPUi中,它就像魅力一样。有没有办法添加名称空间前缀而不检查每个传入的请求?

非常感谢提前!

1 个答案:

答案 0 :(得分:1)

我有点不确定为什么必须提供Action属性,因为SOAP操作可以在没有它的情况下工作。也许有线索......?

或者,如果您希望保留它并希望为每个请求添加命名空间,那么您可以探索XmlDocument类和XmlNode类。这里有一个简单的代码片段,可以在特定节点添加命名空间 -

"fa-circle-o"