2010-03-03 2 views
13

J'ai un service WCF hébergé dans une application Web (IIS). J'ai besoin d'exposer 1 point final sur wsHttp et l'autre sur netTcp. Je suis sur un environnement IIS7 qui me permet d'héberger des services non basés sur HTTP. De toute façon, quand je navigue le. svc fichier à l'aide d'un navigateur, je reçois l'erreur:WCF hébergé dans une application Web et en mode de compatibilité

The service cannot be activated because it does not support ASP.NET compatibility. ASP.NET compatibility is enabled for this application

par googler, je réalise que WCF fonctionne en deux modes - mixtes et ASP.NET compatible. Lorsque je demande l'attribut

[AspNetCompatibilityRequirements(
     RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

Cependant, il semble qu'une fois que j'applique cet attribut à la mise en œuvre du contrat de service, je ne peux pas utiliser une liaison non HTTP.

Comment puis-je le configurer de sorte que:

  • Je peux en charge les périphériques non HTTP
  • Je peux héberger le service sur une application Web
  • Je ne crée pas de multiples services dont une avec aspnet la compatibilité est activée et l'autre est désactivée
+0

Utilisez-vous une fonctionnalité ASP.NET? Si oui, lequel? Peut-il être retiré? –

+0

Pas encore - jusqu'à présent (je ne sais pas si j'utiliserais la session ou le contexte dans le futur). Êtes-vous en train de dire que si je n'utilise aucune fonctionnalité asp.net, je devrais pouvoir désactiver la compatibilité AspNet et l'héberger dans un hébergeur? – DotnetDude

+0

pourquoi ne pas exposer le service en utilisant un service Windows? Je pense que le premier et le second sont impossibles à faire sauf si vous utilisez WAS. –

Répondre

4

En guise de réponse, un paramètre de compatibilité ASP.NET est activé pour votre application IIS. This link semble être liée.

Je vous suggère de désactiver le mode de compatibilité ASP.NET. J'ai couru net.tcp et basicHttp endpoints de la même application dans IIS sans problème.

edit: Ceci est le changement de configuration que vous devez effectuer/vérifier (à partir du lien fourni). La valeur devrait être changée de 'faux' à 'vrai'.

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled=”true” /> 
</system.serviceModel> 
+0

Si je désactive la compatibilité ASP.NET, j'obtiens l'erreur d'activation (message dans mon message original) – DotnetDude

+0

Dans votre article d'origine, vous parlez de l'ajout d'un attribut au service qui détermine si le service peut fonctionner ou non dans AspCompatibilityMode. Je parle de la configuration de l'application - dans votre configuration web - afin que l'application n'utilise pas du tout AspCompatibilityMode (et que votre attribut devienne redondant). Ma réponse a été éditée. –

1

S'il vous plaît essayez de définir multipleSiteBindingsEnabled être vrai dans le ServiceHostingEnvironment. Je ne suis pas un expert en WCF mais après avoir parcouru la question et lu un tas de sites, je pense que cela aurait du sens puisque vous utilisez les points de terminaison de service TCP et HTTP.

Espérons que cela aide.

7

Il se passe beaucoup de choses ici. Tout d'abord, à moins que vous n'utilisiez spécifiquement une fonctionnalité ASP.net, vous ne devez PAS utiliser le mode de compatibilité. Pour éteindre ça, suivre la suggestion de Kirk, et également supprimer cette ligne de votre code:

[AspNetCompatibilityRequirements(
     RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

mode Compatability n'est pas nécessaire juste pour héberger un service HTTP, il est seulement si vous voulez utiliser des fonctionnalités ASP.net que ne sont pas dans WCF (ou ont besoin de porter un ancien service asmx vers WCF sans changer d'autre code).

Le deuxième problème consiste à héberger une liaison non HTTP à l'aide d'IIS. Cela ne fonctionne que dans IIS 7 et n'utilise que WAS. Compatibilité ASP.net ne fonctionnera pas avec une liaison non HTTP, car ASP.net requiert HTTP.

Donc ce que vous essayez de faire est impossible tant que le mode de compatibilité est activé. Retirez-le, et les choses devraient alors fonctionner.

0

J'ai également rencontré ce problème.
résultait de la migration d'un nouveau code, qui faisait référence au système.Espace de noms Web, mais ne l'exigeait pas, dans un projet WCF existant. en supprimant ceux qui utilisent des instructions résolu le problème pour moi.

Je m'attendais à devoir traquer le code qui nécessitait cet espace de noms mais j'ai eu de la chance.

Questions connexes