我有一个从Java客户端调用的WCF Web服务。 java客户端使用固定的WSDL文件。这意味着我必须操纵我的Web服务才能与客户端一起运行。我有多种方法,有些正在运作。 如果我发送一个列表作为响应,我在客户端得到异常。来自java客户端的规范是:
<ns2:methodName xmlns:ns2="http://namespace.de">
<return>
<element1>2015-10-12T11:41:31+02:00</element1>
<element2>testText</element2>
<filename>documentName.pdf</filename>
<element3>99999</element3>
</return>
<return>
<element1>2015-10-12T11:49:13+02:00</element1>
<element2>test 2txt</element2>
<filename>test.txt</filename>
<element3>99999</element3>
<return>
</ns2: methodName >
XSD:
<xs:complexType name="methodName">
<xs:sequence>
<xs:element name="return" type="tns:dataType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
我尝试了很多替代方案,其中之一就是其中之一。
IService:
<OperationContract(Action:="http://namespace/methodNameRequest", Name:="methodName", ReplyAction:="http://namespace/methodNameResponse")>
Function methodName(input As methodName) As methodNameResponse
<MessageContract()>
Public Class methodNameResponse
<MessageBodyMember(Name:="return", [Namespace]:="")>
Public result
End class
没有数据类型,因为有多个响应值,即调用return。
服务:
Public Function methodName(input As methodName) As methodNameResponse Implements IService.methodName
Dim ListeDataType As New List(Of datatype)
Dim value As methodNameResponse = New methodNameResponse()
value.result = ListeDataType
Return ListeDataType
End Function
soapMesssage:
<methodNameResponse xmlns="http://namespace.de">
<return xsi:type="q1:ArrayOfdataType" xmlns="" xmlns:q1="http://namespace.de">
<q1:dataType>
<q1:element1>2014-03-14T21:00:40</q1: element1>
<q1:element2> test text </q1: element2>
<q1:filename >test.txt</q1:filename>
<q1:element3>99999</q1: element3>
</q1:dataType>
<q1:dataType >
<q1:element1>2014-03-14T21:00:40</q1: element1>
<q1:element2> test2 text </q1: element2>
<q1:filename >test2.txt</q1: filename>
<q1:element3>99999</q1: element3>
</q1:dataType >
</return>
</methodNameResponse>
有了这个,我得到了异常:q1:无法将ArrayofDataType解析为元素的类型定义&#34; return&#34;。我尝试了不止一次,但我很高兴再次尝试,如果我成为解决这种行为的好主意。谢谢你的建议。
答案 0 :(得分:0)
@MattC谢谢你的提示。它帮助我解决了我的问题。
解决方案:
使用
构建界面select gowden, year, month, 100*sum(avail_stock)/sum(plan_stock)
from your_table
group by gowden, year, month
/ importXmlTypes - 这个我必须使用,因为标准调用,得到一个异常,因为重复声明'return'。经过一些更正后,它可以使用此代码:
<强> IService:强>
SvcUtil.exe /importXmlTypes *.wsdl *.xsd /language:VB
<强>服务强>
<System.ServiceModel.OperationContractAttribute(Action:="http://namespace/methodNameRequest", ReplyAction:="http://namespace/methodNameResponse"),
System.ServiceModel.XmlSerializerFormatAttribute()>
Function methodName(ByVal input As methodName) As <System.ServiceModel.MessageParameterAttribute(Name:="return")> methodNameResponse
<System.Diagnostics.DebuggerStepThroughAttribute(),
System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0"),
System.ServiceModel.MessageContractAttribute(WrapperName:="methodName", WrapperNamespace:="http://namespace", IsWrapped:=True)>
Partial Public Class methodNameRequest
<System.ServiceModel.MessageBodyMemberAttribute([Namespace]:="http://namespace", Order:=0),
System.Xml.Serialization.XmlElementAttribute(Form:=System.Xml.Schema.XmlSchemaForm.Unqualified)>
Public element1 As String
…
End class
<System.Diagnostics.DebuggerStepThroughAttribute(),
System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0"),
System.ServiceModel.MessageContractAttribute(WrapperName:="methodNameResponse", WrapperNamespace:="http://namespace", IsWrapped:=True)>
Partial Public Class methodNameResponse
<System.ServiceModel.MessageBodyMemberAttribute([Namespace]:="http://namespace", Order:=0),
System.Xml.Serialization.XmlElementAttribute("return", Form:=System.Xml.Schema.XmlSchemaForm.Unqualified)>
Public [return]() As dataType
Public Sub New()
MyBase.New()
End Sub
Public Sub New(ByVal [return]() As dataType)
MyBase.New()
Me.[return] = [return]
End Sub
End Class