WCF размещен в веб-приложении и режиме совместимости

У меня есть служба WCF, размещенная в веб-приложении (IIS). Мне нужно выставить 1 конечную точку над wsHttp, а другую - над netTcp. Я нахожусь в среде IIS7, которая позволяет мне размещать службы, не основанные на HTTP. В любом случае, когда я просматриваю файл. svc с помощью браузера, я получаю сообщение об ошибке:

Служба не может быть активирована, поскольку она не поддерживает ASP.NET совместимость. Для этого приложения включена совместимость с ASP.NET

По googling я понял, что WCF работает в двух режимах - совместим с Mixed и ASP.NET. Когда я применяю атрибут

[AspNetCompatibilityRequirements(
       RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

Однако, похоже, что как только я применил этот атрибут к реализации Сервисного Контракта, я не могу использовать привязку без HTTP.

Как настроить его так, чтобы:

  • Я могу поддерживать конечные точки без HTTP
  • Я могу разместить эту службу в веб-приложении.
  • Я не создаю несколько сервисов с включенной совместимостью aspnet, а другой отключен.

Ответы

Ответ 1

Здесь довольно много происходит. Прежде всего, если вы фактически не используете функцию ASP.net специально, вы НЕ должны использовать режим совместимости. Чтобы отключить это, следуйте предложению Кирка, а также удалите эту строку из своего кода:

[AspNetCompatibilityRequirements(
       RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

Режим совместимости не требуется только для размещения HTTP-сервиса, только если вы хотите использовать функции ASP.net, которые не входят в WCF (или нужно перенести старую службу asmx в WCF без изменения другого кода).

Вторая проблема заключается в размещении привязки без HTTP с использованием IIS. Это работает только в IIS 7 и использует только WAS. Совместимость ASP.net НЕ будет работать с привязкой не HTTP, потому что ASP.net требует HTTP.

То, что вы пытаетесь сделать, невозможно, если включен режим совместимости. Удалите его, а затем все должно работать.

Ответ 2

Угадайте, у вас установлен параметр совместимости ASP.NET для вашего приложения IIS. Эта ссылка кажется связанной.

Я бы предложил вам отключить режим совместимости ASP.NET. Я без проблем запускал конечные точки net.tcp и basicHttp из одного приложения в IIS.

edit: Это изменение конфигурации, которое нужно сделать/проверить (из предоставленной ссылки). Значение должно быть изменено с "false" на "true".

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

Ответ 3

Попробуйте установить multipleSiteBindingsEnabled как true в среде ServiceHostingEnvironment. Я не эксперт в WCF, но, пройдя этот вопрос и читая кучу сайтов, я думаю, что это будет иметь смысл, поскольку вы используете конечные точки службы TCP и HTTP.

Надеюсь, что это поможет.

Ответ 4

Я тоже столкнулся с этой проблемой. это было связано с переносом некоторого нового кода, который ссылался на пространство имен System.Web, но фактически не требовал его, в существующий проект WCF. удаление тех, кто использует заявления, разрешил проблему для меня.

Я ожидал отследить код, требующий этого пространства имен, но повезло.