Служба WCF REST, размещенная в IIS, не поддерживает PUT и DELETE.

Я создал службу WCF REST (также известную как WebHttp) в .NET 4, используя шаблон службы Microsoft WCF REST 40. Я размещаю службу в IIS 6.

Шаблон службы использует RouteTable в Global.asax как способ создания «чистых» URL-адресов, которые не включают в себя «.svc». Например:

http: // локальный / полеты / 878

GET и POST отлично работают с этим URL-адресом, но PUT и DELETE приводят к HTTP 501, «Не реализовано».

Если я создам простой файл .svc, например:

<%@ ServiceHost Language="C#" Debug="true" Service="MyProject.FlightsService"%>

тогда я могу использовать PUT и DELETE для этого URL:

http: // localhost / flightservice.svc / 878

Кто-нибудь знает, можно ли заставить PUT и DELETE работать с "чистым" URL-адресом выше? Кажется, что нет способа настроить IIS, чтобы разрешить это, потому что нет расширения файла для настройки параметров, и я не хочу разрешать PUT и DELETE глобально.


person Mike Taverne    schedule 21.08.2010    source источник
comment
Узнайте, как аналогичная проблема была решена в IIS 7.5, здесь. Решение элегантное.   -  person lmsasu    schedule 19.09.2010


Ответы (2)


Я давно не работал с IIS6 (и у меня он не установлен, поэтому я теряю память), но мне пришлось реализовать нечто подобное с IIS6 для маршрутизации URL-адресов без расширений в IIS6.

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

Можете ли вы ссылаться на свои услуги в подпапке на вашем сайте (например, http://localhost/services/flight/878)? Если это так, и если вы реализуете взлом IIS Manager, описанный выше, я думаю, вы можете включить все HTTP-команды для этого каталога. Опять же, я теряю память (а мы реализовали только GET и POST, поэтому я не занимался PUT и DELETE), поэтому я надеюсь, что у меня все правильно.

Дайте мне знать, если вам понадобится дополнительная информация, или если мне ускользает память. :) Надеюсь, это поможет!

person David Hoerster    schedule 21.08.2010
comment
Спасибо, это сработало! Поскольку мое приложение IIS будет содержать только службы, я установил сопоставление с подстановочными знаками для всего приложения, как описано во второй опубликованной вами ссылке. Большое спасибо! Майк - person Mike Taverne; 23.08.2010
comment
Должен любить эти недокументированные функции. :) Рад, что у вас сработало. - person David Hoerster; 23.08.2010

Если ваше веб-приложение развертывается в нескольких средах разработки / производства, то лучший способ - отключить WebDAV на уровне web.config. Для этого удалите WebDAVModule и обработчик WebDAV, как в примере ниже:

<system.webserver>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webserver>
person DanilF    schedule 06.09.2012
comment
вопрос заключался в том, как включить PUT и DELETE в IIS на уровне приложения. - person deleted_user; 23.09.2012
comment
Да, это приведет к тому, что IIS разрешит его только для текущего приложения, не включая его глобально, как просил исходный плакат. Если вы не удалите модуль и обработчик WebDAV, запросы PUT и DELETE будут перехвачены ими и не будут работать. - person DanilF; 07.10.2012