web-dev-qa-db-ja.com

AspNetCompatibilityRequirementsMode.Allowedがこのエラーを修正するのはなぜですか?

私は、WCFで抱えている問題を解決しようとして探し回っていました。私はWCFが初めてなので、何が起こっているのか正確にはわかりませんでした。

Visual Studio 2010を使用しており、New Web Site-> WCF Serviceを実行しました。サービスを作成し、構成ファイルで_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>
_

私の質問は、なぜ互換性属性を追加するとそれが修正されるのですか?また、シルバーライトにそれが必要なのはなぜですか?

26
Justin

構成ファイルでaspNetCompatibilityEnabledtrueに設定すると、サービスがASP.NETパイプラインに参加することを表明しています。そのため、ASP.NETセッションなどのアイテムを使用できます。 ASP.NET互換モードはデフォルトでfalseに設定されているため、これに該当する場合は、サービスを適切に装飾する必要があります。

したがって、サービス実装をRequirementsModeAllowedで装飾することにより、基本的にサービスがaspNetCompatibilityモードが何であるかを気にしないと言っている幸せな中間地点を示しています。正しいか間違っているか)。 RequirementsModeRequiredである場合、config aspNetCompatibilityEnabledをtrueに設定する必要があります。 RequirementsModeNotAllowedに設定されている場合、逆のことが当てはまります。

(RequirementsModeのAllowedの満足な中間段階に進む場合、aspNetCompatibilityEnabledが有効かどうかを静的 ServiceHostingEnvironment.AspNetCompatibilityEnabled プロパティをチェックすることで、サービス実装でチェックインできます。)

SilverlightはASP.NETパイプライン(私はSilverlight開発者ではありません)に依存している必要があります。そのため、Silverlightアプリによって呼び出されるためには、構成およびサービスでこの互換モードを有効にする必要があります。

これに関するMSDNのドキュメントを確認してください こちら 。知っておくべきことは、ASP.NETパイプラインのグッズが必要ない場合、サービスを装飾したり、構成でaspNetCompatibilityEnabled設定を設定したりする必要がないことです(既定ではオフになっています)。

36
David Hoerster