Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual Studio服务引用WSDL返回类型不为';不匹配_C#_Web Services_Visual Studio_Wsdl_Service Reference - Fatal编程技术网

C# Visual Studio服务引用WSDL返回类型不为';不匹配

C# Visual Studio服务引用WSDL返回类型不为';不匹配,c#,web-services,visual-studio,wsdl,service-reference,C#,Web Services,Visual Studio,Wsdl,Service Reference,我们有一个Java后端,它通过WSDLs提供web服务。有些操作返回xxWSResponse,其中只有一个属性:数组 当我们将VisualStudio中的服务引用添加到web服务时,VS生成的代码直接返回数组,而不是响应。如果响应中有更多属性或更多数组,它将按照预期的方式工作并返回响应 操作示例: <wsdl:operation name="retrieveParameterTasksList"> <wsdl:documentation> isIdempotent

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

当我们将VisualStudio中的服务引用添加到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>
我的问题: 为什么VisualStudio会忽略响应类型并返回其中的数组?如何使其返回实际响应


谢谢大家!

VisualStudio为您创建了一个代理,一旦数组离开您的代码,它将以正确的SOAP响应包装数组。正确的SOAP消息仍然应该由您的应用程序发送——您是否测试过从中返回的XML

它与其他一些方法不同的原因可能是DataContractSerializer和XmlSerializer之间的行为差异。通常VisualStudio会尝试使用DataContractSerializer来生成服务引用。这不会生成请求/响应对象,而是生成接收并返回请求/响应对象内容的方法(例如,
intmultiply(inta,intb);
)。但是,DataContractSerializer比XmlSerializer更具限制性,有时VisualStudio不得不求助于XmlSerializer。在这种情况下,它将生成您在其他所有情况下看到的请求/响应对象(例如,
MultiplyResponse Multiply(Multiply multiplyRequest);
)。无论Visual Studio使用哪个序列化程序,都应生成相同的XML响应

如果需要对生成的SOAP消息进行更多控制,或者如果visual studio没有创建正确的SOAP响应,则可以强制visual studio生成完整的消息契约。为此,请编辑服务引用,或添加一个新引用。单击“高级…”,然后选择“始终生成邮件合同”选项。此处记录了消息契约:

我尝试过“始终生成消息契约”,但没有成功。
<xsd:complexType name="RetrieveParameterTasksListWSResponse">
    <xsd:sequence>
    <xsd:element form="qualified" name="taskListVOs" type="this:TasksListParameterDTO" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
</xsd:complexType>
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;
    }