Comment puis-je envoyer un DataContract objet en tant que paramètre pour un WCF REPOSANT webservice?
Je suis en train d'élaborer un WCF resful un service qui sera essentiellement consommé à partir de certaines applications mobiles.
Sur le POST, je suis en train d'envoyer un DataContract objet [fait j'ai envoyer une Liste d'objet] et un autre id de chaîne. Ma question est de savoir si il est possible de définir ma fonction à accepter DataContract objet et la seule chaîne ?
Voici mon code :
Déclaration d'Interface:
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetDataUsingDataContract/{id}")]
CompositeType GetDataUsingDataContract(string id, CompositeType composite );
}
[DataContract]
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
Réelle définition de la fonction:
public CompositeType GetDataUsingDataContract(string id, CompositeType composite )
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite .BoolValue)
{
composite .StringValue += "- Suffix and the id is"+id;
}
return report;
}
et de l'objet json, je suis en train d'envoyer de Fiddler est
{"BoolValue":true,"StringValue":"sdfsdfsf"}
Ci-dessus sont les boutons de la fiddler je suis en train de tester le service.
Après quelques recherches sur google, j'ai le lien suivant où le client utilise le service web de référence pour obtenir le DataContract type et sérialise json avant de l'envoyer en tant que corps de la requête. Mais pourquoi, alors, mon test de Fiddler ne pas réussir ?!
http://dotnetmentors.com/wcf/wcf-rest-service-to-get-or-post-json-data-and-retrieve-json-data-with-datacontract.aspx
Quelqu'un peut s'il vous plaît suggérer quelque chose ?
Le web.la config est comme ci-dessous:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="JSONWebService.Service1" behaviorConfiguration="JSONWebService.Service1Behavior">
<endpoint address="../Service1.svc"
binding="webHttpBinding"
contract="JSONWebService.IService1"
behaviorConfiguration="webBehaviour" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="JSONWebService.Service1Behavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webBehaviour">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
OriginalL'auteur marifrahman | 2013-09-06
Vous devez vous connecter pour publier un commentaire.
Il ya un couple de choses que vous devez faire pour obtenir ce scénario fonctionne.
Tout d'abord, dans le contrat de service, vous devez indiquer la méthode qui a plusieurs paramètres à la fois la BodyStyle paramètre de la WebInvoke attribut Enveloppé comme indiqué dans cet exemple (adapté à partir de l'exemple que vous avez associé à http://dotnetmentors.com/wcf/wcf-rest-service-to-get-or-post-json-data-and-retrieve-json-data-with-datacontract.aspx):
Avec ce paramètre d'attribut dans la place que vous avez à envelopper le web plusieurs paramètres de la méthode en une chaîne unique de votre client. L'exemple suivant montre une façon de le faire en C#:
Noter que les noms de champ dans la méthode anonyme correspondre les noms des paramètres dans votre méthode web.
Pour référence, le JSON que ce produit ressemble à ceci où vous pouvez voir les id et ordre objets dans la chaîne JSON:
{"id":"10560","order":{"OrderID":"10560","OrderDate":"06/09/2013 12:29:04","ShippedDate":"16/09/2013 12:29:04","ShipCountry":"Uganda","OrderTotal":"781"}}
Vous devriez être en mesure de tester JSON dans ce format dans un violon avec votre exemple.
L'extension de la réponse à faire face à d'autres types de données
À l'aide d'un DataContract qui comprend un bool et un DateTime propriété:
La question ici est de traiter avec la DateTime et faire en sorte que le JSON est un format que le service WCF RESTful peut désérialiser. Pour obtenir que cela fonctionne, j'ai utilisé ce code sur le client:
Note le Sérialiseur JSON paramètres - ce produit est le suivant JSON:
Lorsque je remplace le DataContract avec un Flux de données pour les arguments de la méthode web - ça marche!!!! ajouté le web.config que j'avais raté quelque chose là-bas.
Salut @marifrahman. Vous avez à la fois la RequestFormat et ResponseFormat paramètres dans votre ServiceContract? Je ne peux pas voir "RequestFormat = WebMessageFormat.Json" dans le code que vous avez posté...
Il suffit de le mettre et il semble que le fait de travailler uniquement pour DataMembers de type int et string, mais lorsque j'essaie de DataMembers de type bool ou datetime-je obtenir la même mauvaise erreur de demande; toutefois, un grand merci et s'il vous plaît suggérer à propos de la datamembers dans le DataContracts.
Salut @marifrahman - j'ai prolongé la réponse à face avec bool et DateTime les types de données.
OriginalL'auteur Dominic Betts