如何自定义 SOAP Web 服务名称空间

How are SOAP web service namespaces customized

我正在 asp.net 核心中编写一个 soap 网络服务,使用 soapcore 来替换现有的网络服务。调用者的请求 xml 不能更改,因为我们打算尽量减少那方面的更改。 当前请求 xml 看起来像

<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ser="http://vendornamespace.com/"
    xmlns:idat="http://schemas.datacontract.org/2004/07/iDataContract">
    <soapenv:Header/>
    <soapenv:Body>
        <ser:ActionRequest>
            <ser:composite>
                <idat:param1>H04</idat:param1>
                <idat:param2>100</idat:param2>
            </ser:composite>
        </ser:PlaceOrder>
    </soapenv:Body>
</soapenv:Envelope>

我的网络服务界面看起来像

public interface INewWebsServices
{
    [OperationContract(Action = "ActionRequest")]
    Task<WebSvcResponseClass> ActionRequest([MessageParameter(Name = "composite")] WebServiceReqactionMethod_A);
}

我的请求 class 看起来像

[DataContract (Namespace = "http://schemas.datacontract.org/2004/07/iDataContract", Name ="idat")]
    
[MessageContract()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/iDataContract")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/iDataContract", IsNullable = false)]
public class WebServiceReq
{
    [MessageBodyMember]
    public string param1 { get; set; }

    [MessageBodyMember]
    public string param2 { get; set; }
}

这会生成一个 Web 服务请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ser="http://vendornamespace.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:PlaceOrder>
         <ser:composite>            
            <ser:param1>?</ser:param1>            
            <ser:param2>?</ser:param2>
         </ser:composite>
      </ser:PlaceOrder>
   </soapenv:Body>
</soapenv:Envelope>

显然 header 中缺少 idat 命名空间,并且未在 Web 请求参数中使用。

如何修改我的 WebServiceReq class 以包含缺少的命名空间,以便 SoapCore 可以正确地反序列化传入的请求。

您可以尝试在命名空间 iDataContract 中定义 WebSvcResponseClass,同时使用 [DataMember] 而不是 [MessageBodyMember] 修饰属性。 此外,您可以将服务接口定义为

public interface INewWebsServices
{

    [System.ServiceModel.OperationContractAttribute(Action = "http://domain/namespace", ]
        Task<iDataContract.WebSvcResponseClass> WebServiceReqactionMethod_A(iDataContract.WebserviceRequestclass composite); 
}

如果您尝试使用 soapUI,使用命名空间会生成 idat 作为 Web 服务请求的前缀。