POSTE à WCF de Fiddler réussit, mais transmet des valeurs null
J'ai suivi cette série de vidéos sur WCF et avoir la démo de travail. Il consiste en la construction d'un service WCF qui gère étudiant de formulaires d'évaluation, et met en œuvre les opérations CRUD pour fonctionner sur une liste de ces évaluations. J'ai modifié mon code un peu en fonction de l' ce guide de sorte qu'il sera de retour JSON résultats à un navigateur ou Fiddler demande. Mon objectif est de comprendre comment utiliser le service par la création de ma propre demandes dans un violon, et ensuite utiliser ce format pour utiliser le service à partir d'une application sur un appareil mobile.
J'ai de la difficulté à l'aide de la SubmitEval
méthode (enregistrer une évaluation) de Fiddler. L'appel fonctionne, mais tous les champs de Eval
sont nuls (ou par défaut) à l'exception de Id
, qui est défini dans le service lui-même.
Voici mon Eval
déclaration (à l'aide des propriétés, au lieu de champs cette question):
[DataContract]
public class Eval //Models an evaluation
{
[DataMember]
public string Id { get; set; }
[DataMember]
public string Submitter { get; set; }
[DataMember]
public string Comment { get; set; }
[DataMember]
public DateTime TimeSubmitted { get; set; }
}
Et voici la partie pertinente de IEvalService
:
[ServiceContract]
public interface IEvalService
{
...
[OperationContract]
[WebInvoke(RequestFormat=WebMessageFormat.Json,
ResponseFormat=WebMessageFormat.Json, UriTemplate = "eval")]
void SubmitEval(Eval eval);
}
Et EvalService
:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
class EvalService : IEvalService
{
...
public void SubmitEval(Eval eval)
{
eval.Id = Guid.NewGuid().ToString();
Console.WriteLine("Received eval");
evals.Add(eval);
}
}
Dans un violon Demande du Constructeur, j'ai défini la Méthode de la POSTE et l'adresse de http://localhost:49444/EvalServiceSite/Eval.svc/eval
. J'ai ajouté l'en-tête Content-Type: application/json; charset=utf-8
pour les en-têtes par défaut. Le corps de la requête est:
{"eval":{"Comment":"testComment222","Id":"doesntMatter",
"Submitter":"Tom","TimeSubmitted":"11/10/2011 4:00 PM"}}
La réponse que je reçois à partir de l'envoi de cette demande est 200
, mais quand je regarde ensuite la est évaluée comme qui ont été enregistrées, celui que j'ai juste ajouté de la validité Id
, mais Comment
et Submitter
sont tous deux nuls, et TimeSubmitted
est 1/1/0001 12:00:00 AM
.
Il semble que la WCF est l'obtention de la demande, mais ce n'est pas la désérialisation de l'objet correctement. Mais si c'est le cas, je ne sais pas pourquoi il est pas à jeter quelque sorte d'exception. Ça se sent que je suis en train de faire de ce droit, ou ai-je raté quelque chose?
Mise à JOUR: Voici le point de terminaison de déclaration en Application.config:
<endpoint binding="webHttpBinding" behaviorConfiguration="webHttp"
contract="EvalServiceLibrary.IEvalService" />
Et le point de terminaison du comportement visé:
<behavior name="webHttp">
<webHttp defaultOutgoingResponseFormat="Json"/>
</behavior>
OriginalL'auteur Tom Hamming | 2011-11-10
Vous devez vous connecter pour publier un commentaire.
Le corps de style de la
WebInvoke
attribut est Nu, ce qui signifie que l'objet doit être envoyé sans emballage contenant le nom de l'objet:Ou vous pouvez définir le corps de la requête du style à
Wrapped
, et qui ferait de l'entrée nécessitent l'emballage{"eval"...}
objet:Mise à jour: il y a un autre problème dans votre code, étant donné que vous utilisez
DateTime
, et le format attendu par la WCF sérialiseur pour les dates en JSON est quelque chose comme\/Date(1234567890)\/
. Vous pouvez modifier votre classe pour prendre en charge le format que vous avez en suivant la logique décrite à MSDN Lien (un contrôle précis de format de sérialisation pour les primitives), et indiqué dans le code ci-dessous.Http 400, pour être exact. Le message d'erreur "Le serveur a rencontré une erreur de traitement de la demande. Voir les journaux du serveur pour plus de détails."
C'est parce que le type DateTime dans votre code n'était pas dans le format attendu. J'ai mis à jour la réponse à une solution pour que.
Qui l'a fait! Je m'attendais à analyser un DateTime mieux parce que j'ai travaillé avec les services web avant, et ceux qui étaient pour trouver avec le format habituel.
C'est une plainte commune avec WCF. Sur 4,5 ils en ont fixé de sorte que vous pouvez changer le format de date / heure
OriginalL'auteur carlosfigueira
Pour POSTER, vous devez utiliser BodyStyle = WebMessageBodyStyle.Nu PAS
WebMessageBodyStyle.Enveloppé
OriginalL'auteur Julia Drobot