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

我们有一个通过WSDL提供Web服务的Java后端。 有一些操作返回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来生成您的服务引用。 这不会生成请求/响应对象,而是生成接收和返回请求/响应对象内容的方法(例如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

链接地址: http://www.djcxy.com/p/28009.html

上一篇: Visual Studio Service Reference WSDL return type doesn't match

下一篇: Laravel 5.1 : Migrate existing database