gmn*_*nnn 7 c# wsdl web-services service-reference visual-studio
我们有一个Java后端,通过WSDL提供Web服务.有些操作返回xxWSResponse,其中只有一个属性:一个数组.
当我们在Visual Studio中向Web服务添加服务引用时,VS会生成直接返回数组的代码,而不是响应.如果响应中有更多属性或更多数组,它就像它应该的那样工作并返回响应.
操作样本:
<wsdl:operation name="retrieveParameterTasksList">
<wsdl:documentation> isIdempotent = NO -- TR:/retrieveParameterTasksList{retrieveParameterTasksList} -- EN:/retrieveParameterTasksList{retrieveParameterTasksList} </wsdl:documentation>
<wsdl:input message="tns:retrieveParameterTasksListRequestMsg" name="RetrieveParameterTasksListWSRequest" />
<wsdl:output message="tns:retrieveParameterTasksListResponseMsg" name="RetrieveParameterTasksListWSResponse" />
<wsdl:fault message="tns:SystemFault" name="SystemFault" />
<wsdl:fault message="tns:BusinessFault" name="BusinessFault" />
</wsdl:operation>
Run Code Online (Sandbox Code Playgroud)
RetrieveParameterTasksListWSResponse:
<xsd:complexType name="RetrieveParameterTasksListWSResponse">
<xsd:sequence>
<xsd:element form="qualified" name="taskListVOs" type="this:TasksListParameterDTO" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
Run Code Online (Sandbox Code Playgroud)
VS自动生成的代码:
public namespace.TasksListParameterDTO[] retrieveParameterTasksList(namespace.RetrieveParameterTasksListWSRequest RetrieveParameterTasksListWSRequest) {
namespace.RetrieveParameterTasksListWSRequest1 inValue = new namespace.RetrieveParameterTasksListWSRequest1();
inValue.RetrieveParameterTasksListWSRequest = RetrieveParameterTasksListWSRequest;
namespace.RetrieveParameterTasksListWSResponse retVal = ((namespace.WebServiceV1x0)(this)).retrieveParameterTasksList(inValue);
return retVal.RetrieveParameterTasksListWSResponse1;
}
Run Code Online (Sandbox Code Playgroud)
我的问题:为什么Visual Studio会忽略响应类型并返回其中的数组?如何让它返回实际响应?
谢谢!
小智 3
Visual Studio 已为您创建了一个代理,一旦数组离开您的代码,该代理就会将数组包装在正确的 SOAP 响应中。您的应用程序仍应发送正确的 SOAP 消息 - 您测试过它返回的 XML 内容吗?
它与其他一些方法不同的原因可能是由于 DataContractSerializer 和 XmlSerializer 之间的行为差异。通常,Visual Studio 会尝试使用 DataContractSerializer 来生成服务引用。这不会生成请求/响应对象,而是生成接收并返回请求/响应对象内容的方法(例如int Multiply(int a, int b);
)。但是,DataContractSerializer 比 XmlSerializer 更具限制性,有时 Visual Studio 必须回退到 XmlSerializer。在这种情况下,它将生成您在其他所有内容中看到的请求/响应对象(例如MultiplyResponse Multiply(Multiply multiplyRequest);
)。无论 Visual Studio 使用哪个序列化程序,都应生成相同的 XML 响应。
如果您需要对生成的 SOAP 消息进行更多控制,或者 Visual Studio 未创建正确的 SOAP 响应,您可以强制 Visual Studio 生成完整的消息协定。为此,请编辑服务参考或添加新服务参考。单击“高级...”,然后选择“始终生成消息合同”选项。消息契约记录在此处: https ://msdn.microsoft.com/en-us/library/ms730255.aspx
归档时间: |
|
查看次数: |
950 次 |
最近记录: |