При передаче объекта в качестве аргумента методу строковые свойства заполняются, но целые числа равны нулю - PullRequest
2 голосов
/ 27 января 2011

Я не уверен, что участие в 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 нулевым / не установлено. Вот пример кода клиента.

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 ]

2 голосов
/ 27 января 2011

WCF будет только когда-либо передавать данные - вы не можете раскрыть «метод» через WCF.

WCF - это система сериализованных сообщений - между клиентом и сервером передаются только сериализованные данные - нет другого соединения (без «удаленного объекта» или чего-то подобного)

Но и string, и int должны обрабатываться без проблем ....

Может быть, вы спотыкаетесь об этом поведении ?? Я тоже не совсем понимаю, где ваша проблема - что вы ожидаете, и что вы видите вместо этого ?? Что на самом деле делает ваш сервисный метод в своей реализации ??

Обновление: когда я делаю то же самое, что и вы, а затем использую Отслеживание WCF , чтобы увидеть, что происходит, это запрос, поступающий в службу:

<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, поместите эти два раздела в web.config или app.config службы WCF:

<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 голос
/ 19 апреля 2012

У нашего клиента такая же проблема, и мы не нашли исправления: инкапсулированный сервис WCF в dll vb.net 4.0, а затем из своего exe они показали мне со своей машины, что они передают строки и целые числа,с помощью анализатора пакетов на моем сервере единственными тегами XML мыла, которые я вижу, являются строковые теги.

Я написал клиент в c # 4.0, и он отлично работает, даже с их компьютера.

Михаил Эванчик

0 голосов
/ 04 февраля 2011

Мой коллега обнаружил, что все работает правильно, мы изменили декорации для элементов данных с:

<DataMember()>_
Public Property P_Integer() As Integer
...
End Property

На:

<DataMember(IsRequired:=True)> _
Public Property P_Integer() As Integer
...
End Property

для всех типов значений.Классы типа, такие как строковые, прекрасно работают без этого.

0 голосов
/ 27 января 2011

Для меня это не совсем понятно:

<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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...