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

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

我们有一个 Java 后端,它通过 WSDL 提供网络服务。有一些操作返回 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>

检索参数任务列表WSResponse:

<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 生成完整的消息协定。为此,请编辑服务引用或添加新引用。单击“高级...”,然后选择“始终生成消息契约(Contract)”选项。消息契约(Contract)记录在此处:https://msdn.microsoft.com/en-us/library/ms730255.aspx

关于c# - Visual Studio 服务引用 WSDL 返回类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31874357/

相关文章:

java - JMS 可以做什么而 REST 不能做什么

c++ - 查看内存转储的调用堆栈时,如何在VS中指定源代码目录?

c# - 在 Azure 门户中的何处查找日志信息

c# - 如何禁用服务器上的 DNS 身份检查

c# - 代码优先与数据库优先

c# - 在 asp.net 中自动完成选择多个标签

C#-线程和父子传递

android 如何发送 int 和 double 作为 namevaluepair 作为 http post

使用 VS 测试专家进行 C++ 单元测试

c# - 如何在 Visual Studio 中为项目引用设置 "Specific Version"属性