2012-03-20 11 views
26

Stavo cercando in giro cercando di risolvere un problema che sto avendo con WCF. Sono molto nuovo a WCF quindi non ero sicuro di cosa stesse succedendo.Perché AspNetCompatibilityRequirementsMode.Allowed risolve questo errore?

Sto utilizzando Visual Studio 2010 e ho creato Nuovo sito Web-> Servizio WCF. Ho creato il mio servizio e nel file di configurazione, se ho impostato aspNetCompatibilityEnabled="true", ricevo questo errore quando accedo al servizio tramite il mio browser 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'. 

Non capisco cosa significhi. Perché aspNetCompatibilityEnabled="true" causa questo errore quando [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)] lo corregge.

Per me, suonano come se facessero la stessa cosa. Inoltre, senza quell'attributo silverlight non era in grado di chiamare i miei metodi WCF. Perché?

Ecco il mio file di configurazione, se necessario:

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

Quindi la mia domanda è, perché aggiungendo la compatibilità attributo rimediare? Inoltre, perché era necessario per Silverlight averlo?

risposta

36

Quando si imposta aspNetCompatibilityEnabled su true nel file di configurazione, si afferma che i servizi parteciperanno alla pipeline ASP.NET; quindi articoli come la sessione ASP.NET sono disponibili. È necessario decorare adeguatamente i servizi in questo caso, poiché la modalità di compatibilità ASP.NET è impostata su false per impostazione predefinita.

Quindi, decorare la vostra implementazione del servizio con un RequirementsMode di Allowed, si sta affermando una via di mezzo felice che dice in sostanza il servizio non si preoccupa quello che la modalità aspNetCompatibility è (vero o falso). Se lo RequirementsMode è Required, è necessario configurare Config aspNetCompatibilityEnabled su true; è vero il contrario se il tuo RequirementsMode è impostato su NotAllowed.

(Se si va con la terra di mezzo felice di RequirementsMode di ammessi, è possibile controllare nella vostra implementazione del servizio se aspNetCompatibilityEnabled è abilitato o non controllando la ServiceHostingEnvironment.AspNetCompatibilityEnabled proprietà statica.)

Silverlight deve avere una dipendenza dal Pipeline ASP.NET (non sono uno sviluppatore Silverlight), motivo per cui è necessario abilitare questa modalità di compatibilità nella configurazione e nei servizi per poter essere richiamati dalle app Silverlight.

Controllare la documentazione di MSDN su questo here. La cosa da sapere è che se non hai bisogno di accessori per pipeline ASP.NET, allora non hai bisogno di decorare i tuoi servizi o di impostare l'impostazione aspNetCompatibilityEnabled nella tua configurazione (sono disattivati ​​per impostazione predefinita).

+0

Domanda, quale sarebbe questa decorazione appropriata se la impostassi su vero? – Justin

+0

Dipende se il servizio richiede elementi disponibili con la pipeline ASP.NET. Se non ti interessa davvero, lo imposteresti in 'RequirementsMode.Allowed'. Se ti affidi a quei componenti (come Session), dovresti impostarlo su 'RequirementsMode.Required'. –

Problemi correlati