Вызов WCF, передающий нулевой параметр - PullRequest
2 голосов
/ 12 февраля 2010

У меня есть служба WCF WebHttpBinding, которую я вызываю. Мой первый метод POST отправляет объект правильно, но последующие вызовы методов POST для объекта передают ноль.

Вот мой сервис:

public void Update(ObjectDTO objectDTO)
{
  string token = WebOperationContext.Current != null ? WebOperationContext.Current.IncomingRequest.Headers["token"] : string.Empty;

  //Authentication
  bool isUserAuthenticatedResult = IsUserAuthenticated(ref token);
  if (!isUserAuthenticatedResult)
      return null;

  //Perform service action
  MyDtoManager = new MyDtoManager();
  objectDTO = MyDtoManager.Update(objectDTO); 
  return objectDTO;
}

Вот мой контракт на обслуживание:

* +1007 *

Вот моя конфигурация сервера:

<system.serviceModel>
  <bindings>
    <webHttpBinding>
      <binding name="WebHttpBindingConfig" 
           openTimeout="00:05:00" 
           sendTimeout="00:05:00"
           maxBufferSize="65536000" 
           maxBufferPoolSize="52428800" 
           maxReceivedMessageSize="65536000"
           transferMode="Buffered">
      <readerQuotas maxDepth="32" 
                  maxStringContentLength="65536000" 
                  maxArrayLength="16384" 
                  maxBytesPerRead="4096" 
                  maxNameTableCharCount="16384" />
      <security>
        <transport />
      </security>
    </binding>
  </webHttpBinding>
 </bindings>
 <services>
   <service behaviorConfiguration="Services.ServiceBehavior"
        name="Services.MyDtoService">
     <endpoint address="" 
          behaviorConfiguration="HttpBehavior" 
          binding="webHttpBinding" 
          name="Services.MyDtoService"
          contract="ServiceInterfaces.IMyDtoService">
     <identity>
        <dns value="localhost" />
     </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
 </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="Services.ServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="HttpBehavior">
      <webHttp />
    </behavior>
  </endpointBehaviors>
</behaviors>
</system.serviceModel>

И, наконец, мой клиентский код звонит:

IMyDtoService myDtoService = new WebChannelFactory<IMyDtoService>(BindingConfig, new Uri("http://localhost:8080/MyDtoService.svc")).CreateChannel();
using (new OperationContextScope((IClientChannel)myDtoService))
{
    if (WebOperationContext.Current != null)
        WebOperationContext.Current.OutgoingRequest.Headers.Add("token", tokenResult.Result);

    ObjectDTO insertResult = ipAddressService.Insert(new ObjectDTO
                                              { ObjectGuid = Guid.NewGuid(),
                                                IsAllow = true,
                                                Identifier = 1,
                                                IdentifierType = 0,
                                                StartIpAddress = "192.168.0.1"
                                              });
    List<ObjectDTO> loadByIdResult1 = myDtoService.LoadById(insertResult.ObjectGuid.ToString());
    Console.WriteLine("Insert Found: " + loadByIdResult1.Count);

    insertResult.IsAllow = false;
    ObjectDTO updateResult = ipAddressService.Update(insertResult);
}

Как вы видите, мой клиентский код вызывает мою службу WCF, и метод вставки работает отлично, и я вижу постоянный объект в моей базе данных. Однако при обновлении параметр ObjectDTO имеет значение null. Если я загружаю существующий объект и выполняю обновление, он работает отлично. Кажется, это проблема с последующими вызовами службы WCF с использованием методов POST. У меня нет этой проблемы с методами GET.

Ответы [ 2 ]

1 голос
/ 02 февраля 2013

Я прошел через эту проблему, но WCF SOAP. На клиентском сайте вы можете видеть объект, заполненный значениями, когда точка отладки приходит в сервис, она нулевая. Это произошло из-за изменения в кожухе параметра. . Если вы видите, что ваш контракт на обслуживание имеет

Обновление ObjectDTO (ObjectDTO objectDto );

и определение имеет публичное обновление void (ObjectDTO objectDTO ), обратите внимание на разницу в регистре

1 голос
/ 13 февраля 2010

Вы не указали соответствующий код, чтобы быть на 100% уверенным, в чем проблема. Но похоже, что это ноль, потому что эта строка:

ObjectDTO insertResult = ipAddressService.Insert(new ObjectDTO 
                                              { ObjectGuid = Guid.NewGuid(), 
                                                IsAllow = true, 
                                                Identifier = 1, 
                                                IdentifierType = 0, 
                                                StartIpAddress = "192.168.0.1" 
                                              }); 

возвращает ноль. Так что вам нужно проверить метод вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...