我在IIS7 Classic上运行了一个Web表单应用程序。它为网站的客户端部分使用.asmx样式的Web服务。
我们的任务是在“友好网址”中进行分层,并决定使用新的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)。对Web服务的任何请求都会给我们留下永远的乐趣:
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& 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”我看到“方法未实现”,就像我期望的那样。
我的怀疑是我们的* - &gt; aspnet_isapi.dll正在肆虐,因为我在搜索Google时没有发现其他人这样做。
感谢您提前获得任何见解。
答案 0 :(得分: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" />
这样可以正确处理文件
答案 1 :(得分:1)