我不确定参与的WCF是否重要。
我有一个暴露给客户端asp.net应用程序的类和方法。该课程看起来像
<DataContract()> _
Public Class Class1
Private v_string As String
Private v_integer As Integer
Public Sub New()
v_string = ""
v_integer = -1
End Sub
<DataMember()> _
Public Property P_String() As String
Get
Return v_string
End Get
Set(ByVal value As String)
v_string = value
End Set
End Property
<DataMember()> _
Public Property P_Integer() As Integer
Get
Return v_integer
End Get
Set(ByVal value As Integer)
v_integer = value
End Set
End Property
End Class
该方法声明为
<OperationContract()> _
Function GetStuff(ByVal bar As Class1) As String
在客户端代码中,我创建了Class1的实例并设置了v_string和v_integer的值,但是使用Wireshark来查看发送到服务器的xml,只有v_string的值作为Class1的一部分发送。我猜这是因为它认为v_integer的值为null / not set。以下是客户端代码的示例。
Dim MyService as New Service1.ServiceClient
Dim test as New Service1.Class1
test.P_integer = 1
test.P_string = "hello"
Dim result as String = MyService.GetStuff(test)
我猜这是一个传递/使用不同类型的问题,因为Integer是一个整数类型而String是一个类,但似乎无法解决该问题的解决方法。
答案 0 :(得分:2)
WCF只会传输数据 - 您不能通过WCF公开“方法”。
WCF是一个序列化消息传递系统 - 只有序列化数据在客户端和服务器之间传输 - 没有其他连接(没有“远程对象”或类似的东西)上。
但string
和int
都应该处理没问题....
也许你正在绊倒这种行为?我不完全明白你的问题在哪里 - 你期待什么,你看到了什么?您的服务方法在实现中实际做了什么?
更新:当我做同样的事情,然后使用WCF Tracing查看正在发生的事情,这是进入服务的请求:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:8433/Services/GetStuff</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IGetStuffService/GetStuff</Action>
</s:Header>
<s:Body>
<GetStuff xmlns="http://tempuri.org/">
<data xmlns:a="http://schemas.datacontract.org/2004/07/wcf_test"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:P_Integer>5</a:P_Integer>
<a:P_String>Where to go for holidays...</a:P_String>
</data>
</GetStuff>
</s:Body>
</s:Envelope>
那么你没有看到它应该在那里是什么?.....我清楚地看到SOAP消息中的整数和字符串值 - 正如预期的那样。
你可能没有看到1
的价值,因为它隐藏在某个字节流中吗?尝试指定一些其他值,例如4711067
或其他 - 在您的消息中不会丢失....
要启用WCF跟踪,请将这两部分放入WCF服务的web.config
或app.config
中:
<system.diagnostics>
<sources>
<source name="UserTraceSource" switchValue="Warning, ActivityTracing" >
<listeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="C:\logs\UserTraces.svclog" />
</listeners>
</source>
</sources>
<trace autoflush="true" />
</system.diagnostics>
(确保C:\logs
目录存在于!!)和
<system.serviceModel>
<diagnostics>
<messageLogging maxMessagesToLog="30000"
logEntireMessage="true" logMalformedMessages="true"
logMessagesAtServiceLevel="false"
logMessagesAtTransportLevel="true">
<filters>
<clear/>
</filters>
</messageLogging>
</diagnostics>
</system.serviceModel>
现在,您将在*.svclog
中获取C:\logs
个文件 - 打开Windows资源管理器,双击它们,然后您应该进入WCF Trace Viewer进行分析。
答案 1 :(得分:1)
我们的客户端遇到了同样的问题,我们还没有找到修复,在vb.net 4.0 dll中封装了一个WCF服务,然后从他们向他们展示了他们传递字符串和整数的机器,在我的服务器上使用数据包嗅探器,我看到的唯一的soap xml标签是字符串标签。
我已经在c#4.0中编写了一个客户端,它工作正常,甚至可以从他们的机器上运行。
Michael Evanchik
答案 2 :(得分:0)
这对我来说没有意义:
<DataMember()> _
Public Property P_Integer() As Integer
Get
Return v_integer
End Get
Set(ByVal value As Integer)
v_string = value
End Set
End Property
该Set函数不应该是:
v_integer = value
答案 3 :(得分:0)
我的一位同事发现,外翻工作正常,我们改变了数据成员的装饰:
<DataMember()>_
Public Property P_Integer() As Integer
...
End Property
要:
<DataMember(IsRequired:=True)> _
Public Property P_Integer() As Integer
...
End Property
表示所有值类型。如果没有这个类,字符串等类工作正常。