2010-02-12 5 views
2

J'ai un service WCF WebHttpBinding que j'appelle. Ma première méthode POST envoie correctement l'objet, mais les appels suivants aux méthodes POST passent null pour l'objet.Appel WCF passant un paramètre nul

Voici mon service:

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; 
} 

Voici mon contrat de service:

[ServiceContract] 
public interface IMyDtoService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    List<ObjectDTO> LoadById(string value); 

    [OperationContract] 
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    List<ObjectDTO> Load(string field, string value); 

    [OperationContract] 
    [WebInvoke(Method="GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    List<ObjectDTO> LoadAll(); 

    [OperationContract(Name = "InsertSingle")] 
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] 
    ObjectDTO Insert(ObjectDTO objectDto); 

    [OperationContract(Name = "UpdateSingle")] 
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] 
    ObjectDTO Update(ObjectDTO objectDto); 

    [OperationContract(Name = "DeleteSingle")] 
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] 
    ObjectDTO Delete(ObjectDTO objectDto); 
} 

Voici ma configuration du serveur:

<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> 

Et enfin mon code client qui fait l'appel :

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); 
} 

Comme vous pouvez voir mes appels de code client mon service WCF et la méthode d'insertion fonctionne parfaitement bien et je peux voir l'objet persistant dans ma base de données. Cependant, lors de la mise à jour, le paramètre ObjectDTO est null. Si je charge un objet existant et que j'effectue une mise à jour, cela fonctionne parfaitement. Il semble être un problème avec les appels ultérieurs au service WCF utilisant des méthodes POST. Je n'ai pas ce problème avec les méthodes GET.

+0

Faire des tests, si je déplace mon appel de mise à jour à son propre: utilisant (nouveau OperationalContextScope ((IClientChannel) myDtoService)) alors mes deux méthodes Insérer et mise à jour de travail. Si ma méthode Update reste telle qu'elle est dans mon exemple publié, la méthode Update obtient une valeur NULL pour le paramètre ObjectDTO. Quelqu'un peut-il expliquer pourquoi? – Brandon

Répondre

1

Vous n'avez pas montré le code approprié pour être sûr à 100% du problème. Mais il semble que ce soit null parce que cette ligne:

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

renvoie null. Vous devez donc vérifier la méthode d'insertion.

+0

Mon objet insertResult est rempli après l'appel. Je crois que cela a quelque chose à voir avec le OperationalContextScope. Si je sépare les appels de méthode Insert et Update dans leur propre OperationalContextScopes, les deux méthodes obtiennent les résultats corrects et transmettent les paramètres corrects. – Brandon

1

J'ai rencontré ce problème mais WCF SOAP. Sur le site client, vous pouvez voir l'objet rempli de valeurs lorsque le point de débogage est en service, il est nul. Il était arrivé en raison de changement dans le boîtier de param.. Si vous voyez votre contrat de service a

ObjectDTO Update (ObjectDTO objectDto); Mise à jour (ObjectDTO objetDTO), noter la différence dans le boîtier.