【问题标题】:Visual Studio Service Reference WSDL return type doesn't matchVisual Studio 服务参考 WSDL 返回类型不匹配
【发布时间】:2015-10-30 16:47:09
【问题描述】:

我们有一个 Java 后端,它通过 WSDL 提供 Web 服务。有一些操作返回 xxWSResponse,其中只有 1 个属性:一个数组。

当我们在 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 会忽略响应类型并返回其中的数组?如何让它返回实际响应?

谢谢!

【问题讨论】:

    标签: c# web-services visual-studio wsdl service-reference


    【解决方案1】:

    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

    【讨论】:

    • 我尝试了“始终生成消息合同”,但没有成功。
    猜你喜欢
    • 2012-12-08
    • 1970-01-01
    • 2014-01-09
    • 2015-11-15
    • 1970-01-01
    • 2012-12-31
    • 2013-07-15
    • 1970-01-01
    相关资源
    最近更新 更多