Configuration WCF Enfer?
Je déteste WCF installation avec des points de terminaison, les comportements, etc. Je crois que toutes ces choses doivent être effectués automatiquement. Tout ce que je veux faire est de retour JSON résultat de mon service WCF. Voici ma configuration:
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="default"/>
</webHttpBinding>
</bindings>
<services>
<service name="HighOnCodingWebApps.ZombieService"
behaviorConfiguration="MyServiceTypeBehaviors">
<endpoint address="" binding="webHttpBinding"
bindingConfiguration="default"
contract="HighOnCodingWebApps.IZombieService"
behaviorConfiguration="webScriptEnablingBehavior"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webScriptEnablingBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false"/>
Et j'ai le service suivant la mise en œuvre:
public class ZombieService : IZombieService
{
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "KnownZombies")]
public Zombie GetZombie()
{
return new Zombie() { Name = "Mohammad Azam"};
}
}
public class Zombie
{
public string Name { get; set; }
}
Lorsque je visite http://localhost:22059/ZombieService/KnownZombies
dit le message suivant:
Postes clients à l'aide de "UriTemplate' ne peut pas être utilisé avec le Système de la.ServiceModel.Description.WebScriptEnablingBehavior'.
Si je supprime le WebScriptEnablingBehavior à partir du web.config j'obtiens l'erreur suivante:
Le message avec Pour
'http://localhost:22059/ZombieService.svc/KnownZombies" ne peut pas être
traitées au niveau du récepteur, en raison d'une AddressFilter inadéquation à l'
EndpointDispatcher. Vérifiez que l'émetteur et du récepteur
EndpointAddresses d'accord.
Mise à JOUR 1:
J'ai mis à jour la configuration de ce:
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="default"/>
</webHttpBinding>
</bindings>
<services>
<service name="HighOnCodingWebApps.ZombieService"
behaviorConfiguration="MyServiceTypeBehaviors">
<endpoint address="http://localhost:22059/ZombieService.svc" binding="webHttpBinding"
bindingConfiguration="default"
contract="HighOnCodingWebApps.IZombieService"
/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="SomeBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Maintenant quand je visite http://localhost:22059/ZombieService.svc/KnownZombies
je reçois le message suivant dans le navigateur:
Le message avec Pour
'http://localhost:22059/ZombieService.svc/KnownZombies" ne peut pas être
traitées au niveau du récepteur, en raison d'une AddressFilter inadéquation à l'
EndpointDispatcher. Vérifiez que l'émetteur et du récepteur
EndpointAddresses d'accord.
Découvrez WCF 4.0 - il a remédié beaucoup de la configuration des maux de tête! Lire Un Développeur Intro à la WCF 4 pour des détails.
mise à jour de la question
OriginalL'auteur azamsharp | 2011-08-11
Vous devez vous connecter pour publier un commentaire.
Prendre un coup d'oeil à cette SORTE de question.
Edit: étant donné que vous n'êtes pas en indiquant une adresse pour votre service, essayez de frapper: http://localhost:22059/ZombieService.svc/KnownZombies (avec l' .svc).
Je pense aussi que vous avez besoin de la
<webHttp />
comportement ajoutée à votre comportement de point de terminaison.Edit: Essayez de changer votre point de terminaison définition:
Appuyer sur la touche enter est en train de me tuer...je vais modifier ma réponse à la place.
OriginalL'auteur BrandonZeider
Avez-vous essayé la WCF SvcConfigEditor? Il est accessible depuis le menu Outils de Visual Studio. Ouvrez votre web/app.config avec SvcConfigEditor pour obtenir GUI aide sur l'obtention de tout droit.
OriginalL'auteur Anders Abel
Vous utilisez le WebInvokeAttribute qui raconte WCF par défaut pour accepter le POSTE en tant que le verbe. Puisque vous tentez d'y accéder via une action, il est ignoré.
Utilisation WebGetAttribute à la place.
Par MSDN:
OriginalL'auteur Josh
Personnellement, je n'aime pas toutes les options de configuration WCF offre (j'ai ranted avant), et dans votre cas, vous n'avez pas besoin d'utiliser la configuration du tout. Pour un service simple pour le retour JSON, vous pouvez utiliser un hôte de service de l'usine, et il y a une qui est exactement ce que fait (mis en place un
webHttpBinding
/webHttp
comportement d'extrémité), leSystem.ServiceModel.Activation.WebServiceHostFactory
. Dans votre cas, vous pouvez:Que c'est. Voici ce que l' .svc devrait ressembler à:
Encore une chose: j'ai remarqué que votre classe n'est pas décoré avec
[ServiceContract]
, mais vous avez un[WebGet]
attribut dans votre méthode dans la classe. Si l'interface (IZombieService) est l'une décorée avec[ServiceContract]
, la méthode dans l'interface devrait être l'une décorée avec[WebGet]
. Vous pouvez également ignorer de l'interface complètement et décorer la ZombieService classe avec `[ServiceContract].OriginalL'auteur carlosfigueira
Je suis à l'aide .net framework 4, VS2010.
J'ai fait une fausse erreur dans mon global.asax.cs au lieu de créer une instance de WebServiceHostFactory
J'ai frappé WebScriptServiceHostFactory grâce à intellSense. Comme un résultat que j'ai obtenu le même message d'erreur:
Les ordinateurs d'extrémité à l'aide de 'UriTemplate' ne peut pas être utilisé avec le Système de la.ServiceModel.Description.WebScriptEnablingBehavior'.
J'ai corrigé l'instance de WebServiceHostFactory dans mon global.asax.cs, je ne vois pas l'erreur plus.
OriginalL'auteur yantaq
Suffit d'utiliser ASP.NET l'API Web au lieu de la WCF
Bien que cela puisse être de bons conseils, il n'est pas une réponse à une question. Le petit pop-up lorsque vous rédigez une réponse spécifiquement dit d'éviter de faire des déclarations fondées sur l'opinion.
OriginalL'auteur rpgmaker
Dans votre
WebGet
ouWebInvoke
Spécifier votreBodyStyle
àWrappedRequest
, puis retirez leUriTemplate
. Lors de l'Invocation de votre utilisation du service le nom de la fonction.Espère que cela aide.
Exemple:
OriginalL'auteur Walter