web-dev-qa-db-fra.com

Pourquoi AspNetCompatibilityRequirementsMode.Allowed corrige cette erreur?

Je cherchais pour essayer de résoudre un problème que j'ai avec WCF. Je suis très nouveau à WCF, donc je ne savais pas exactement ce qui se passait.

J'utilise Visual Studio 2010 et ai fait un nouveau site Web-> Service WCF. J'ai créé mon service et dans le fichier de configuration, si je définis aspNetCompatibilityEnabled="true", J'obtiendrais cette erreur en accédant au service via mon navigateur Web.

The service cannot be activated because it does not support ASP.NET compatibility.
ASP.NET compatibility is enabled for this application. Turn off ASP.NET compatibility mode in the web.config
or add the AspNetCompatibilityRequirements attribute to the service type with RequirementsMode 
setting as 'Allowed' or 'Required'.

Je ne comprends pas ce que cela signifie. Pourquoi aspNetCompatibilityEnabled="true" Provoque cette erreur lorsque [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)] le corrige.

Pour moi, on dirait qu'ils font la même chose. De plus, sans cet attribut, silverlight n'a pas pu appeler mes méthodes WCF. Pourquoi donc?

Voici mon fichier de configuration si nécessaire:

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <customErrors mode="Off"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="LargeBuffer" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" />
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="Services.Exporter">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="LargeBuffer"
          contract="Services.IExporter" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment
      multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

Ma question est donc la suivante: pourquoi l'ajout de l'attribut de compatibilité corrige-t-il cela? Aussi, pourquoi était-il nécessaire que Silverlight l'ait?

26
Justin

Lorsque vous définissez aspNetCompatibilityEnabled sur true dans votre fichier de configuration, vous indiquez que vos services participeront au pipeline ASP.NET; des éléments comme la session ASP.NET sont donc disponibles. Vous devez décorer vos services de manière appropriée si tel est le cas, car le mode de compatibilité ASP.NET est défini sur false par défaut.

Ainsi, en décorant votre implémentation de service avec un RequirementsMode de Allowed, vous énoncez un juste milieu qui dit que votre service ne se soucie pas de ce qu'est le mode aspNetCompatibility ( vrai ou faux). Si votre RequirementsMode est Required, vous devez avoir la configuration aspNetCompatibilityEnabled définie sur true; l'inverse est vrai si votre RequirementsMode est défini sur NotAllowed.

(Si vous optez pour le juste milieu de RequirementsMode of Allowed, vous pouvez vérifier dans votre implémentation de service si aspNetCompatibilityEnabled est activé ou non en vérifiant la propriété statique ServiceHostingEnvironment.AspNetCompatibilityEnabled .)

Silverlight doit avoir une dépendance sur le pipeline ASP.NET (je ne suis pas un développeur Silverlight), c'est pourquoi vous devez activer ce mode de compatibilité dans votre configuration et sur vos services afin qu'ils soient appelés par les applications Silverlight.

Consultez la documentation de MSDN à ce sujet ici . La chose à savoir est que si vous n'avez pas besoin de goodies de pipeline ASP.NET, vous n'avez pas besoin de décorer vos services ou de définir le paramètre aspNetCompatibilityEnabled dans votre configuration (ils sont désactivés par défaut).

36
David Hoerster