处理 asp.net 个空 Web 应用程序的所有请求
Handle all requests on asp.net empty web application
我想处理所有请求。 我无法处理具有扩展名的请求。让我告诉你我的意思。
1) 首先让我向您展示我的网络应用程序有什么:(非常简单)
Web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<customErrors mode="On" defaultRedirect="Handle404.aspx">
<error statusCode="404" redirect="Handle404.aspx" />
</customErrors>
<compilation debug="true"/>
</system.web>
</configuration>
Global.asax
using System;
namespace DeleteMeWebAppliation
{
public class Global : System.Web.HttpApplication
{
protected void Application_BeginRequest(object sender, EventArgs e)
{
Console.Write("Test");
}
protected void Application_Error(object sender, EventArgs e)
{
Console.Write("Test");
}
}
}
Default.aspx
using System;
namespace DeleteMeWebAppliation
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Console.WriteLine("test");
}
}
}
Handle404.aspx
using System;
namespace DeleteMeWebAppliation
{
public partial class Handle404 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Console.Write("Test");
}
}
}
2) 现在问题来了:
注意我在所有行上都有一个断点Console.Write("Test")
我的目标是处理所有请求。 **换句话说,无论 url.
每次向 IIS 发出请求时,我都想命中断点
a) 当我转到 http://localhost:65284/
它有效 (我遇到了一个断点)
b) 当我转到 http://localhost:65284/SomeNoneExistingPage.aspx
它有效 (我遇到了一个断点)
c) 当我转到 http://localhost:65284/Foooooo
它有效 (我遇到了一个断点)
d) 当我转到 http://localhost:65284/Foooooo/fooo/fooo/test.aspx
它有效 (我遇到了一个断点)
e) 当我转到 http://localhost:65284/foo.test
它失败 (我没有遇到断点) 为什么方法 Application_Error 上的断点会没打中!?
e) 当我转到 http://localhost:65284/foo/foo.jpg
它失败了 (我没有遇到断点) 为什么方法 Application_Error 上的断点会没打中!?
总而言之,当有人访问 http://localhost:65284/foo.test
时,我如何执行自定义代码。一切都很好,但是当我去 url 时,它有一个 '.'最后用别的东西而不是 aspx 然后它失败了!
互联网上有很多地方展示了如何处理 404 错误,但由于某些原因我无法使它起作用。
这是我在转到 http://localhost:65284/foo.test
时得到的结果 我收到 404 错误并且由于某种原因我没有被重定向到 404 处理程序。如果 link 以 aspx 结尾,我将被重定向。没意义
找到解决方案。
Web 配置看起来像:
<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*" type="HandleAllRequestsHandler"/>
</httpHandlers>
<compilation debug="true"/>
</system.web>
<system.webServer>
<handlers>
<add verb="*" path="*" name="ImageWatermarkHandler" type="HandleAllRequestsHandler"/>
</handlers>
<validation validateIntegratedModeConfiguration="false"/>
</system.webServer>
</configuration>
现在我用这个处理程序处理所有请求:
using System;
using System.Web;
public class HandleAllRequestsHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
Console.WriteLine("Test!");
}
public bool IsReusable => false;
}
请注意,我在这里处理所有请求,因为动词和路径具有值 *
。将您的自定义过滤器放在那里
看来您能够应用正确的解决方案。如果您仍然想知道以下问题的答案:
"e) 当我转到 http://localhost:65284/foo.test 时它失败了(我没有遇到断点)为什么方法 Application_Error 上的断点没有命中!?
e) 当我转到 http://localhost:65284/foo/foo.jpg 时它失败了(我没有遇到断点)为什么方法 Application_Error 上的断点没有命中!?”
这些在您之前的配置中没有重定向的原因是该标记适用于有效的页面请求,并且仅在请求获得 "handled" 后才应用。您的请求从未通过 IIS 中的处理程序。
我认为以下内容比较好地说明了流程:
您的自定义处理程序 HandleAllRequestsHandler
将属于模块部分。
我想处理所有请求。 我无法处理具有扩展名的请求。让我告诉你我的意思。
1) 首先让我向您展示我的网络应用程序有什么:(非常简单)
Web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<customErrors mode="On" defaultRedirect="Handle404.aspx">
<error statusCode="404" redirect="Handle404.aspx" />
</customErrors>
<compilation debug="true"/>
</system.web>
</configuration>
Global.asax
using System;
namespace DeleteMeWebAppliation
{
public class Global : System.Web.HttpApplication
{
protected void Application_BeginRequest(object sender, EventArgs e)
{
Console.Write("Test");
}
protected void Application_Error(object sender, EventArgs e)
{
Console.Write("Test");
}
}
}
Default.aspx
using System;
namespace DeleteMeWebAppliation
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Console.WriteLine("test");
}
}
}
Handle404.aspx
using System;
namespace DeleteMeWebAppliation
{
public partial class Handle404 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Console.Write("Test");
}
}
}
2) 现在问题来了:
注意我在所有行上都有一个断点Console.Write("Test")
我的目标是处理所有请求。 **换句话说,无论 url.
a) 当我转到 http://localhost:65284/
它有效 (我遇到了一个断点)
b) 当我转到 http://localhost:65284/SomeNoneExistingPage.aspx
它有效 (我遇到了一个断点)
c) 当我转到 http://localhost:65284/Foooooo
它有效 (我遇到了一个断点)
d) 当我转到 http://localhost:65284/Foooooo/fooo/fooo/test.aspx
它有效 (我遇到了一个断点)
e) 当我转到 http://localhost:65284/foo.test
它失败 (我没有遇到断点) 为什么方法 Application_Error 上的断点会没打中!?
e) 当我转到 http://localhost:65284/foo/foo.jpg
它失败了 (我没有遇到断点) 为什么方法 Application_Error 上的断点会没打中!?
总而言之,当有人访问 http://localhost:65284/foo.test
时,我如何执行自定义代码。一切都很好,但是当我去 url 时,它有一个 '.'最后用别的东西而不是 aspx 然后它失败了!
互联网上有很多地方展示了如何处理 404 错误,但由于某些原因我无法使它起作用。
这是我在转到 http://localhost:65284/foo.test
时得到的结果 我收到 404 错误并且由于某种原因我没有被重定向到 404 处理程序。如果 link 以 aspx 结尾,我将被重定向。没意义
找到解决方案。
Web 配置看起来像:
<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*" type="HandleAllRequestsHandler"/>
</httpHandlers>
<compilation debug="true"/>
</system.web>
<system.webServer>
<handlers>
<add verb="*" path="*" name="ImageWatermarkHandler" type="HandleAllRequestsHandler"/>
</handlers>
<validation validateIntegratedModeConfiguration="false"/>
</system.webServer>
</configuration>
现在我用这个处理程序处理所有请求:
using System;
using System.Web;
public class HandleAllRequestsHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
Console.WriteLine("Test!");
}
public bool IsReusable => false;
}
请注意,我在这里处理所有请求,因为动词和路径具有值 *
。将您的自定义过滤器放在那里
看来您能够应用正确的解决方案。如果您仍然想知道以下问题的答案:
"e) 当我转到 http://localhost:65284/foo.test 时它失败了(我没有遇到断点)为什么方法 Application_Error 上的断点没有命中!?
e) 当我转到 http://localhost:65284/foo/foo.jpg 时它失败了(我没有遇到断点)为什么方法 Application_Error 上的断点没有命中!?”
这些在您之前的配置中没有重定向的原因是该标记适用于有效的页面请求,并且仅在请求获得 "handled" 后才应用。您的请求从未通过 IIS 中的处理程序。
我认为以下内容比较好地说明了流程:
您的自定义处理程序 HandleAllRequestsHandler
将属于模块部分。