2012-03-20 2 views
26

私はWCFで問題を解決しようとしていました。私はWCFにはとても新しいので、何が起こっているのか正確にはわからなかった。AspNetCompatibilityRequirementsMode.Allowedがこのエラーを修正するのはなぜですか?

私はVisual Studio 2010を使用しており、新しいWebサイト - > WCFサービスを行っています。サービスを作成し、設定ファイルにaspNetCompatibilityEnabled="true"を設定すると、私の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'. 

この意味はわかりません。 [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]を修正すると、なぜaspNetCompatibilityEnabled="true"がこのエラーを引き起こすのですか?

私にとって、彼らは同じことをするように聞こえる。また、その属性がなければ、Silverlightは私のWCFメソッドを呼び出すことができませんでした。何故ですか?必要であれば、ここで

は私の設定ファイルである:

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

だから私の質問は、なぜ互換性を追加しないと、その属性を修正するのですか?また、なぜ銀色のためにそれが必要でしたか?

答えて

36

設定ファイルにaspNetCompatibilityEnabledtrueを設定すると、サービスがASP.NETパイプラインに参加することになります。したがって、ASP.NETセッションのようなアイテムが利用できます。この場合、ASP.NET Compatibility Modeがデフォルトでfalseに設定されているため、サービスを適切に飾る必要があります。

のでAllowedRequirementsModeを使用してサービスの実装を飾ることで、あなたは基本的に、あなたのサービスがaspNetCompatibilityモードが(trueまたはfalse)が何であるかを気にしないと言う幸せな妥協点を述べています。 RequirementsModeRequiredの場合は、config aspNetCompatibilityEnabledをtrueに設定する必要があります。 RequirementsModeNotAllowedに設定されている場合は、反対です。

(あなたが可のRequirementsModeの幸せな妥協で行く場合aspNetCompatibilityEnabledは、静的ServiceHostingEnvironment.AspNetCompatibilityEnabledプロパティをチェックすることで有効にされているかどうか、あなたはあなたのサービスの実装に確認することができます。)

シルバーへの依存関係を持っている必要がありますASP.NETパイプライン(私はSilverlight開発者ではありません)です。そのため、Silverlightアプリケーションで呼び出すためには、この互換モードを設定とサービスで有効にする必要があります。

このhereに関するMSDNのドキュメントを参照してください。知っておくべきことは、ASP.NETパイプラインを必要としない場合、サービスをデコレートする必要はなく、設定でaspNetCompatibilityEnabled設定を設定する必要はありません(デフォルトではオフになっています)。

+0

質問、私はそれをtrueに設定すると、この適切な装飾は何ですか? – Justin

+0

サービスがASP.NETパイプラインで利用可能なアイテムを必要とするかどうかによって異なります。本当に気にしなければ、それを 'RequirementsMode.Allowed'に設定します。これらのコンポーネント(Sessionなど)に依存している場合は、それを 'RequirementsMode.Required'に設定する必要があります。 –

関連する問題