WCF REST Service de ne pas accepter de JSON .Net 4
J'ai essayé la StandardEndpoints qui ont été introduites dans le cadre de .Net 4 et je suis le plus étrange des erreurs.
Mon code
[ServiceContract]
public interface IAuthenticator
{
[OperationContract]
[WebInvoke(UriTemplate = "AuthenticateUser", Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
AuthPacket AuthenticateUser(string Username, string Password, string DeviceId);
}
De mon site web.config
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<standardEndpoints>
<webHttpEndpoint>
<!--
Configure the WCF REST service base address via the global.asax.cs file and the default endpoint
via the attributes on the <standardEndpoint> element below
-->
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
L'exception qui me rend fou!
415 Cannot process the message because the content type 'application/json' was not
the expected type 'text/xml; charset=utf-8'.
Je peut faire que le problème va revenir à la .Net 3.5 standard de déclarer chaque service, mais, sauf erreur de ma part, l'une des améliorations majeures dans la WCF .Net 4 a été sa capacité à gérer des trucs comme ça. Suis-je en train de faire quelque chose de mal?
Avez-vous essayé de supprimer
Ceci est enveloppé dans un .svc fichier sans définie à l'usine.
Vous devriez essayer d'utiliser .svc avec l'usine
Avez-vous des progrès pour résoudre le problème?
BodyStyle = WebMessageBodyStyle.WrappedRequest
attribut? Comment vous accueillir le CWF? Utilisez-vous .svc? Qui factory
utilisez-vous dans le .svc fichier?Ceci est enveloppé dans un .svc fichier sans définie à l'usine.
Vous devriez essayer d'utiliser .svc avec l'usine
"System.ServiceModel.Activation.WebServiceHostFactory"
ou inclure d'autres de la section dans le site web.config qui font la même chose sans .svc fichier. Voir stackoverflow.com/questions/4680162/host-wcf-in-mvc2-site/... pour plus de détails. En outre, il pourrait aider si vous incluez du code client (jQuery.ajax ou ce que vous utilisez), qui suit de la décrit le message d'erreur.Avez-vous des progrès pour résoudre le problème?
OriginalL'auteur thaBadDawg | 2011-02-15
Vous devez vous connecter pour publier un commentaire.
Si j'ai lu ce contrat d'opération correctement, vous avez défini JSON à votre réponse format - mais pas votre demande format:
Pourrait être le problème?? Qu'advient-il si vous ajoutez
RequestFormat = WebMessageFormat.Json
à votre contrat d'opération ??Mise à jour: si vous êtes en utilisant WCF 4 "out of the box", de son protocole de cartographie permet d'associer les
http://
régime avecbasicHttpBinding
.Pour résoudre ce problème, vous devez remplacer la valeur par défaut du protocole de cartographie comme ceci (dans votre site web.config):
Protocole Par Défaut Cartographie
La réponse à cette question est simple. WCF définit un protocole par défaut de mappage entre le transport de protocoles (par exemple, http, net.tcp, net.pipe, etc) et le haut-WCF liaisons. Le protocole par défaut de correspondance est trouvée dans l' .NET 4 de la machine.config.commentaires de fichier qui ressemble à ça:
Maintenant, par défaut
http://.....
devrait être mappé àwebHttpBinding
.(tiré de: Un Développeur d'Introduction à Windows Communication Foundation 4 )
eh bien, .NET 4 a ces points de terminaison standard - le mappage par défaut pour le
http://
régime est d'utiliserbasicHttpBinding
, cependant. Donc, sauf si vous l'avez changé, que la cartographie, lorsque vous utilisez unhttp://somethingoranother.......
adresse, WCF 4 par défautbasicHttpBinding
- paswebHttpBinding
Lorsque je passe à utiliser le protocole de cartographie-je obtenir cette exception : Le message avec 'localhost/TokenAuthProvider/Authentificateur.svc/AuthenticateUser' ne peut pas être traitées au niveau du récepteur, en raison d'une AddressFilter inadéquation à la EndpointDispatcher. Vérifiez que l'émetteur et le récepteur du EndpointAddresses d'accord.
Cela ne semble pas fonctionner pour moi. 500 maintenant, au lieu de 415.
OriginalL'auteur marc_s