将对象作为参数传递给方法时,将填充字符串属性,但整数为空

时间:2011-01-27 19:13:02

标签: vb.net wcf

我不确定参与的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是一个类,但似乎无法解决该问题的解决方法。

4 个答案:

答案 0 :(得分:2)

WCF只会传输数据 - 您不能通过WCF公开“方法”。

WCF是一个序列化消息传递系统 - 只有序列化数据在客户端和服务器之间传输 - 没有其他连接(没有“远程对象”或类似的东西)上。

stringint都应该处理没问题....

也许你正在绊倒这种行为?我不完全明白你的问题在哪里 - 你期待什么,你看到了什么?您的服务方法在实现中实际做了什么?

更新:当我做同样的事情,然后使用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.configapp.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

表示所有值类型。如果没有这个类,字符串等类工作正常。