C# Visual Studio服务引用WSDL返回类型不为';不匹配
我们有一个Java后端,它通过WSDLs提供web服务。有些操作返回xxWSResponse,其中只有一个属性:数组 当我们将VisualStudio中的服务引用添加到web服务时,VS生成的代码直接返回数组,而不是响应。如果响应中有更多属性或更多数组,它将按照预期的方式工作并返回响应 操作示例: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
<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;
}