繁体   English   中英

Visual Studio服务引用WSDL返回类型不匹配

[英]Visual Studio Service Reference WSDL return type doesn't match

我们有一个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>

RetrieveParameterTasksListWSResponse:

<xsd:complexType name="RetrieveParameterTasksListWSResponse">
    <xsd:sequence>
    <xsd:element form="qualified" name="taskListVOs" type="this:TasksListParameterDTO" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
</xsd:complexType>

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;
    }

我的问题:为什么Visual Studio会忽略响应类型并返回其中的数组? 如何让它返回实际响应?

谢谢!

Visual Studio为您创建了一个代理,它将在离开代码后将数组包装在正确的SOAP响应中。 您的应用程序仍应发送正确的SOAP消息 - 您是否已测试从其返回的XML?

它与其他一些方法不同的原因可能是由于DataContractSerializer和XmlSerializer之间的行为差​​异。 通常,Visual Studio将尝试使用DataContractSerializer来生成服务引用。 这不会生成请求/响应对象,而是生成接收和返回Request / Response对象内容的方法(例如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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM