Веб-служба WCF RESTful под IIS - перезапись URL (получение 404 ошибок) - PullRequest
5 голосов
/ 09 августа 2011

У меня есть веб-сервис 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>

1 Ответ

0 голосов
/ 01 октября 2011

ОБНОВЛЕНИЕ: Оказывается, что WCF может отвечать только на один конкретный заголовок узла HTTP за раз, и что моя перезапись URL была связана с ответом на некоторые заголовки узла, но не на другие. Стандартизировав один набор заголовков хостов и изменив правила переписывания, я начал работать.

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