2009-05-13 6 views
2

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

Нам поручили расслоение в «дружественных 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 WebService запросы (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.

Спасибо за любую информацию заранее.

ответ

3

Вам нужно добавить 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" /> 

Это позволяет файлы, которые будут обрабатываться правильно