我正在尝试使用ASP构建一个Web服务,它将提供三个参数:字符串,日期/时间和另一个字符串。在制作方法之后,wsdl包含:
<s:element name="TimesheetAudit"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="employeeNumber" type="s:string"/> <s:element minOccurs="1" maxOccurs="1" name="periodEndDate" type="s:dateTime"/> <s:element minOccurs="0" maxOccurs="1" name="timesheet" type="s:string"/> </s:sequence> </s:complexType> </s:element>
调用我的网络服务的黑匣子抱怨参数数量不匹配。我假设这是因为我的webmethod在技术上采用了1个参数,一个复杂的类型,而不是三个。
这是问题吗?如果是这样,我该怎么做才能克服它?
编辑:在这种情况下,消费者是黑匣子,我必须塑造我的网络服务以匹配来电者。 将
[SoapDocumentMethod(ParameterStyle = SoapParameterStyle.Bare)]
添加到我的方法签名会出现以下错误:' does not conform to WS-I Basic Profile v1.1. Please examine each of the normative statement violations below. To turn off conformance check set the ConformanceClaims property on corresponding WebServiceBinding attribute to WsiClaims.None.
R2204: A document-literal binding in a DESCRIPTION MUST refer, in each of its soapbind:body element(s), only to wsdl:part element(s) that have been defined using the element attribute.
- Part 'input' of message 'TimesheetAuditSoapIn' from service description with targetNamespace='http://www.netdes.com/'.
- Part 'TimesheetAuditResult' of message 'TimesheetAuditSoapOut' from service description with targetNamespace='http://www.netdes.com/'.
答案 0 :(得分:1)
如果没有关于客户期望到底的更多信息,很难确定,但这可能是参数风格问题。
默认情况下,ASP.NET Web服务使用“Wrapped”参数样式,这意味着所有参数都包含在SOAP主体内部发送的单个元素中。
您可以更改方法声明以使用“Bare”参数样式,该样式将所有参数直接放在SOAP正文中,而不使用包装器元素。这是通过Web方法上的SoapDocumentMethodAttribute上的ParameterStyle属性实现的。
有关详细信息,请参阅this MSDN entry。
响应一致性错误:您可以通过在web.config中添加以下内容来禁用WS-I一致性检查:
<configuration>
<system.web>
<webServices>
<conformanceWarnings>
<remove name='BasicProfile1_1'/>
</conformanceWarnings>
</webServices>
</system.web>
</configuration>
一致性通常是一件好事,但并不是必需的。由于在这种情况下您无法控制定义,因此您没有太多选择。
客户端也可能期望RPC样式的Web服务而不是文档样式的Web服务。 (这将使用SoapRpcMethodAttribute而不是SoapDocumentMethodAttribute进行控制。)如果在关闭一致性警告后仍然没有运气,则可以尝试更改为RPC样式并查看是否有效。
如果有任何方法可以为客户端获取定义(源代码或更好的,用于生成源代码的WSDL),以便您可以确定它的预期结果,那将有所帮助。如果您可以获得WSDL,则可以让.NET以正确的格式为您生成Web服务方法。
答案 1 :(得分:0)
听起来你是构建网络服务主机的人,所以你可以运行这个节目吧?
如果您可以启动Visual Studio,请单击“文件”,“新建网站”,向其添加Web服务,使用自动生成的WSDL并从测试工具成功连接到该工具,然后该Web服务的使用者应该能够阅读相同的WSDL并连接到它和你。重要的是你有一个有效的测试工具。
如果是这种情况,那么黑匣子的问题就在于它们的末端,而不是你的。