我们有一个 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/