У меня есть веб-сервис WCF RESTful (с использованием webHttpBinding), работающий под IIS, предоставляемый через файл SVC (доступный по адресу http://projectserver/BlarghService/BlarghService.svc).
. Я могу получить доступ к конечным точкам службы через шаблоны URI, определенные в каждой службе, с помощьюиспользуя файл BlarghService.svc, например так:
http://projectserver/BlarghService/BlarghService.svc/accounts/
http://projectserver/BlarghService/BlarghService.svc/accounts/342432
Оба эти варианта работают нормально.
Однако важно удалить детали реализации из URI, поэтому я использовал модуль перезаписи URI IIS иустановить правило перезаписи подстановочных знаков, которое связывает все после / BlarghService / до конца BlarghService.svc, поэтому в более ранние представления преобразуется следующее:
http://projectserver/BlarghService/accounts/
http://projectserver/BlarghService/accounts/342432
Однако, когда я запрашиваю эти ресурсы, я получаю 404ошибки. Это не сгенерированные IIS ошибки 404, а сгенерированные самим ASP.NET (поэтому IIS корректно переписывает URL-адрес). Однако ASP.NET решает проверить, является ли указанный файл («BlarghService.svc / accounts / 342432»).) существует в файловой системе, которая должна передавать его моему веб-сервису.
Но strДело в том, что когда я копирую сообщенный «Запрошенный URL» (из ошибки ASP.NET 404) обратно в адресную строку, он отлично работает.
Так что же происходит?
РЕДАКТИРОВАТЬ:Вот мой web.config (находится в каталоге "BlarghService")
<system.web>
<compilation debug="true" />
<authentication mode="None" />
<customErrors mode="Off" />
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<!-- Currently ASP.NET steps in says it's a 404 error when it should be handled by BlarghService.svc, I've no idea why. -->
<rewrite>
<rules>
<rule name="BlarghServiceRewriteRule" patternSyntax="Wildcard">
<match url="*" />
<action type="Rewrite" url="BlarghService.svc/{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
<add prefix="http://projectserver/BlarghService" />
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
<services>
<service name="Foo.Blargh.Api.BlarghService" behaviorConfiguration="BlarghServiceBehavior">
<endpoint name="BlarghEndpoint" address="BlarghService.svc" behaviorConfiguration="BlarghEndpointBehavior" binding="webHttpBinding" contract="RH.Blargh.Api.BlarghService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="BlarghServiceBehavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="BlarghEndpointBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>