我获得了WebService的WSDL,我必须实现它并从中生成它的基本结构(尝试使用.NET SDK中的svcutils.exe和Visual Studio的WSDL.blue插件)。有人会使用此WebService,但我无法更改他们执行的请求类型。这是我从客户端捕获的SOAP请求示例:
<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
<env:Header></env:Header>
<env:Body>
<ns1:setNetworkActivatorResponse xmlns:ns1='http://client.response.ws.meh/'>
<OrderResponse>
<orderHeader>
<clientID>trD-125205</clientID>
<description>0</description>
<operation>trD</operation>
<orderKey>
<applicationContext>
<URL>http://xxx.xxx.xxx.xxx:8181/</URL>
<hostName>xxx.xxx.xxx.xxx</hostName>
</applicationContext>
<applicationDN>XYPT</applicationDN>
<primaryKey>170809</primaryKey>
</orderKey>
<priority>1</priority>
</orderHeader>
<info>
Yadda Yadda Yadda text.
</info>
</OrderResponse>
</ns1:setNetworkActivatorResponse>
</env:Body>
</env:Envelope>
此请求在WebServer上调用正确的方法(setNetworkActivatorResponse()),但方法的参数OrderResponse作为null传递。我认为它与命名空间有关,因为如果我修改请求并将ns1命名空间添加到OrderResponse(如<ns1:OrderResponse> </ns1:OrderResponse>
),则参数将正确传递,并且OrderResponse对象在C#方法中可用。
我的方法被定义为典型的C#.NET WebService:
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[WebService(Namespace = "http://client.response.ws.meh/")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://client.response.ws.meh/")]
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://client.response.ws.meh/", ConfigurationName = "ResponseClientWebService")]
public class ResponseClientWebService : System.Web.Services.WebService
{
[WebMethod]
public void setNetworkActivatorResponse(OrderResponse OrderResponse)
{
String meh = OrderResponse.info;
}
}
这是我的OrderResponse课程:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://client.response.ws.na.agorang.ptinovacao.pt/")]
public partial class OrderResponse
{
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string messageID;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public OrderHeader orderHeader;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string info;
}
还定义并实现了所需的类(OrderResponse等)。知道我可以在我的代码中改变什么(因为我无法更改客户端的请求以在OrderResponse上拥有ns1名称空间)以使其能够接受SOAP请求吗? 谢谢!
答案 0 :(得分:0)
OrderResponse类的XmlTypeAttribute
行是您的Web服务要求存在于特定命名空间中的原因。要解决这个问题,我很确定你可以从文件中删除这行代码。
但是,从生成的代码中删除此行不是最佳解决方案,因为从WSDL重新生成会将此行重新放回代码中。理想情况下,您可以修改WSDL,以便将元素定义为存在于空白目标命名空间中。