2009-08-03 7 views
0

J'ai un service WCF exposé avec un point de terminaison webHttpBinding.Sérialisation d'un objet dans le corps d'une requête WCF à l'aide de webHttpBinding

[OperationContract(IsOneWay = true)] 
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, 
    BodyStyle = WebMessageBodyStyle.Bare, 
    UriTemplate = "/?action=DoSomething&v1={value1}&v2={value2}")] 
void DoSomething(string value1, string value2, MySimpleObject value3); 

En théorie, si j'appelle cela, les deux premiers paramètres (valeur1 & valeur 2) sont tirées de l'Uri et une finale (value3) devraient être désérialisé du corps de la demande.

En supposant que j'utilise Json comme RequestFormat, quelle est la meilleure façon de sérialiser une instance de MySimpleObject dans le corps de la requête avant de l'envoyer? Ceci, par exemple, ne semble pas fonctionner:

HttpWebRequest sendRequest = (HttpWebRequest)WebRequest.Create(url); 
sendRequest.ContentType = "application/json"; 
sendRequest.Method = "POST"; 
using (var sendRequestStream = sendRequest.GetRequestStream()) 
{ 
    DataContractJsonSerializer jsonSerializer = 
     new DataContractJsonSerializer(typeof(MySimpleObject)); 
    jsonSerializer.WriteObject(sendRequestStream, obj); 
    sendRequestStream.Close(); 
} 
sendRequest.GetResponse().Close(); 
+0

J'ai supprimé des références à REST de cette question car cela ne fait que créer de la confusion. Si vous faisiez quelque chose de RESTful alors cette question serait sans importance. –

+0

Suggestion: essayez-le avec ce dernier paramètre étant un int et commencez par travailler. –

+0

John Saunders: Je l'ai déjà fait. Cela fonctionne bien sans le paramètre object et avec l'objet remplacé par un int. –

Répondre

0

Une chose que je ferais différemment est de mettre le WebResponse dans un bloc using:

using (var response = sendRequest.GetResponse()) 
{ 
} 

Je serais préoccupé par ce qui se passe si le Close lève une exception dans votre code.

Également, consignez-vous des exceptions? Vous pouvez essayer:

try 
{ 
    using (var response = sendRequest.GetResponse()) 
    { 
    } 
} 
catch (Exception ex) { 
    Console.WriteLine(ex.ToString()); // Or however you want to display it 
    throw; 
} 

Cela garantira que vous connaissez des problèmes avec la réponse (comme un état HTTP non-200).

+0

Il n'y a aucune exception. Le code de réponse du noeud final est 202 Accepté. J'ai regardé les journaux de suivi de service et il y a eu quelques erreurs de concordance dans certains cas et des erreurs de désérialisation dans d'autres. Je l'ai maintenant en utilisant à la fois la sérialisation Json (via DataContractJsonSerializedr et Json.Net) et l'utilisation de XmlSerializer. –

0

J'ai maintenant cela en utilisant à la fois la sérialisation Json (via DataContractJsonSerializer et Json.Net) et en utilisant le XmlSerializer. La chose étrange est que la propriété RequestFormat = WebMessageFormat.Xml dans l'attribut web invoke semble être ignorée, c'est-à-dire que les messages entrants semblent être désérialisés de xml ou de json indépendamment de ce paramètre.

+0

Pourriez-vous poster comment cela vous a bien fonctionné? –

Questions connexes