Почему AspNetCompatibilityRequirementsMode.Allowed исправляет эту ошибку? - PullRequest
26 голосов
/ 20 марта 2012

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

Я использую Visual Studio 2010 и сделал новый веб-сайт-> 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?

1 Ответ

36 голосов
/ 20 марта 2012

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...