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.
удаление тех, кто использует заявления, разрешил проблему для меня.
Я ожидал отследить код, требующий этого пространства имен, но повезло.