2012-03-20 19 views
26

Estaba buscando intentando resolver un problema que estoy teniendo con WCF. Soy muy nuevo en WCF, así que no estaba seguro de qué estaba pasando exactamente.¿Por qué AspNetCompatibilityRequirementsMode.Allowed soluciona este error?

Estoy usando Visual Studio 2010 e hice un nuevo sitio web-> WCF Service. Creé mi servicio y en el archivo de configuración, si configuré aspNetCompatibilityEnabled="true", obtendría este error cuando vaya al servicio a través de mi navegador 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'. 

No entiendo lo que esto significa. Por qué aspNetCompatibilityEnabled="true" causa este error cuando [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)] lo arregla.

Para mí, suenan como si hicieran lo mismo. Además, sin ese atributo, Silverlight no pudo llamar a mis métodos WCF. ¿Porqué es eso?

Aquí está mi archivo de configuración si es necesario:

<?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> 

Así que mi pregunta es, ¿por qué la adición de la compatibilidad atribuyen arreglar eso? Además, ¿por qué era necesario que Silverlight lo tuviera?

Respuesta

36

Cuando establece aspNetCompatibilityEnabled en true en su archivo de configuración, indica que sus servicios participarán en la interconexión de ASP.NET; para que elementos como la sesión de ASP.NET estén disponibles. Si este es el caso, debe decorar sus servicios adecuadamente, ya que el modo de compatibilidad ASP.NET se establece en falso de manera predeterminada.

Así que por la decoración de su aplicación con un servicio de RequirementsModeAllowed, que está indicando un punto medio feliz que básicamente dice que su servicio no le importa cuál es el modo de aspNetCompatibility (verdadero o falso). Si su RequirementsMode es Required, entonces necesita tener la configuración aspNetCompatibilityEnabled establecida en verdadero; lo contrario es cierto si su RequirementsMode se establece en NotAllowed.

(Si vas con el punto medio feliz de RequirementsMode de animales, se puede comprobar en su implementación del servicio si aspNetCompatibilityEnabled está habilitado o no marcando la ServiceHostingEnvironment.AspNetCompatibilityEnabled propiedad estática.)

Silverlight debe tener una dependencia de la Tubería de ASP.NET (no soy un desarrollador de Silverlight), por lo que necesita habilitar este modo de compatibilidad en su configuración y en sus servicios para que las aplicaciones de Silverlight puedan invocarlos.

Consulte la documentación de MSDN en este here. Lo que hay que saber es que, si no necesita productos de ASP.NET, no necesita decorar sus servicios o establecer la configuración aspNetCompatibilityEnabled en su configuración (están desactivados de manera predeterminada).

+0

Pregunta, ¿cuál sería esta decoración adecuada si la configuro como verdadera? – Justin

+0

Depende de si su servicio necesita elementos disponibles con la interconexión ASP.NET. Si realmente no te importa, entonces debes configurarlo en 'RequirementsMode.Allowed'. Si confía en esos componentes (como Session), entonces debe configurarlo en 'RequirementsMode.Required'. –

Cuestiones relacionadas