Маршрутизация Asp.net, веб-сервисы и IIS7 Classic - PullRequest
2 голосов
/ 14 мая 2009

У меня есть приложение для веб-форм, работающее на IIS7 Classic. Он использует веб-сервисы в стиле .asmx для клиентской части сайта.

Нам было поручено наложение на "дружественные URL", и мы решили использовать новую маршрутизацию Asp.net. У нас в IIS есть правило для сопоставления всех запросов с aspnet_isapi.dll, что приводит к объявлению в нашем файле web.config (system.webServer / hanlers):

<add name="asp.net routing" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" preCondition="classicMode,runtimeVersionv2.0,bitness32" />

Но теперь маршрутизация нарушает наши запросы к веб-сервису .asmx (формы http://example.com/blah.asmx/SomeMethod).. Любой запрос к веб-сервису всегда доставляет нам удовольствие:

Failed to Execute URL.
[HttpException (0x80004005): Failed to Execute URL.]
System.Web.Hosting.ISAPIWorkerRequestInProcForIIS6.BeginExecuteUrl(String url, String method, String childHeaders, Boolean sendHeaders, Boolean addUserIndo, IntPtr token, String name, String authType, Byte[] entity, AsyncCallback cb, Object state) +2004885
System.Web.HttpResponse.BeginExecuteUrlForEntireResponse(String pathOverride, NameValueCollection requestHeaders, AsyncCallback cb, Object state) +393
System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state) +223
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8677954
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously) +155

Ввод этой строки в настройках наших маршрутов:

routes.Add(new Route("{service}.asmx/{*pathInfo}", new StopRoutingHandler()));

все еще оставляет нас с исключением "Не удалось выполнить URL". Я знаю, что маршрут совпадает из-за этого:

public sealed class DieHandler : IRouteHandler
{
    #region IRouteHandler Members

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        throw new NotImplementedException();
    }

    #endregion
}
routes.Add(new Route("{service}.asmx/{*pathInfo}", new DieHandler()));

С этим маршрутом вместо «Не удалось выполнить URL» я вижу «Метод не реализован», как и следовало ожидать.

Я подозреваю, что наш * -> aspnet_isapi.dll наносит ущерб, поскольку я не нашел никого, кто делал бы это во время поиска в Google.

Спасибо за любые идеи заранее.

Ответы [ 2 ]

3 голосов
/ 29 января 2010

Вам нужно добавить requireAccess="None" к обработчику в web.config, то есть:

<add name="aspnet_isapi 32-bit" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv2.0,bitness32" />

Это позволяет правильно обрабатывать файлы

1 голос
/ 14 мая 2009

Вы хотите добавить правило, чтобы игнорировать определенные маршруты. Увидеть: Asp.Net Routing: как игнорировать несколько групповых маршрутов? или же http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

...