Подтвердить что ты не робот

Почему AspNetCompatibilityRequirementsMode.Allowed исправляет эту ошибку?

Я искал, пытаясь решить проблему, с которой я столкнулся с WCF. Я очень новичок в WCF, поэтому не был уверен, что происходит.

Я использую Visual Studio 2010 и New Web Site- > WCF Service. Я создал свою службу и в файле конфигурации, если я установил aspNetCompatibilityEnabled="true", я получал бы эту ошибку при обращении к службе через мой веб-браузер.

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'.

Я не понимаю, что это значит. Почему aspNetCompatibilityEnabled="true" вызывает эту ошибку, когда [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)] исправляет ее.

Мне кажется, они делают то же самое. Кроме того, без этого атрибута 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>

Итак, мой вопрос: зачем добавляет атрибут совместимости? Кроме того, почему это необходимо для Silverlight?

4b9b3361

Ответ 1

Когда вы устанавливаете aspNetCompatibilityEnabled в true в свой файл конфигурации, вы заявляете, что ваши службы будут участвовать в конвейере ASP.NET; поэтому доступны такие элементы, как сеанс ASP.NET. Вы должны соответствующим образом украсить свои службы, если это так, поскольку для режима совместимости ASP.NET по умолчанию установлено значение false.

Итак, украсив реализацию вашего сервиса с помощью RequirementsMode Allowed, вы заявляете о счастливой середине, которая в основном говорит, что вашему сервису все равно, что режим aspNetCompatibility (true или false). Если ваш RequirementsMode равен Required, вам необходимо установить для параметра config aspNetCompatibilityEnabled значение true; наоборот, если ваш RequirementsMode установлен на NotAllowed.

(Если вы идете со счастливым средним уровнем RequirementsMode of Allowed, вы можете проверить свою реализацию сервиса, если включен aspNetCompatibilityEnabled или нет, проверив статический ServiceHostingEnvironment.AspNetCompatibilityEnabled.)

Silverlight должен иметь зависимость от конвейера ASP.NET(я не разработчик Silverlight), поэтому вам нужно включить этот режим совместимости в своей конфигурации и ваших сервисах, чтобы их вызывал Silverlight приложения.

Ознакомьтесь с документацией MSDN на этом здесь. Дело в том, что если вам не нужны атрибуты конвейера ASP.NET, вам не нужно украшать ваши сервисы или устанавливать параметры aspNetCompatibilityEnabled в вашем конфиге (они по умолчанию отключены).