asp.net自定义HttpHandler和URL路由

asp.net自定义HttpHandler和URL路由,url,routing,httphandler,Url,Routing,Httphandler,我想处理对我的应用程序的请求”http://example.com/whateverpath由一个定制的HttpHandler返回,但返回的内容取决于“whateverpath”的值 因此,用户访问”http://example.com/path1“将得到与用户访问不同的响应”http://example.com/path2,但两个请求必须在同一个HttpHandler中处理。其思想是在数据库中查找“whateverpath”,并根据结果返回响应内容 我听说了URL路由,我已经有了一个自定义Ht

我想处理对我的应用程序的请求”http://example.com/whateverpath由一个定制的HttpHandler返回,但返回的内容取决于“whateverpath”的值

因此,用户访问”http://example.com/path1“将得到与用户访问不同的响应”http://example.com/path2,但两个请求必须在同一个HttpHandler中处理。其思想是在数据库中查找“whateverpath”,并根据结果返回响应内容

我听说了URL路由,我已经有了一个自定义Http处理程序,但是我可以结合这两种技术来获得我需要的吗

我将非常感谢任何关于这个问题的评论

干杯
Frank Abel

我不建议将URL路由和HTTP处理程序结合起来

这似乎是URL路由的完美工作。但是,我不会为它使用HTTP处理程序

只需将“~/CustomData/whateverpath”映射到ASPX页面。然后让页面从数据库加载数据。毕竟,如果无论“whateverpath”是什么,查找数据的逻辑都是相同的,那么您就不想对每个变量重复您的逻辑。相反,您希望将其映射到一个文件,该文件将为所有情况加载正确的数据


HTTP处理程序是一个完全不同的问题,不应用于此目的。(顺便说一句,我刚刚发表了一篇关于HTTP处理程序的文章。您可以在上查看它)。

因此您有一个实现
IHttpHandler
的类,名为:
MyHandler
,它位于命名空间
示例
,您需要在站点的
Web.Config
部分中创建以下条目:

对于本地开发人员Web服务器(嵌入到Visual Studio中),这就是所需的全部内容。对于IIS,您还需要告诉IIS如何处理这些URL(因为服务器首先分析请求以决定将其发送到何处,包括是否将其发送到ASP.NET或其他扩展)

  • 打开:IIS管理器->
  • 部分:网站->
  • 右键单击您的网站->
  • 选项:属性->
  • 选项卡:主目录->
  • 按钮:[配置…]->
  • 选项卡:映射->
  • 部分:“通配符应用程序映射(实现顺序):”->
  • 按钮:[插入…]->
  • 可执行文件:“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet\u isapi.dll”(或处理程序使用的.NET运行时的任何版本)->
  • 取消选中“验证文件是否存在”->
  • 按钮:[确定]
现在IIS和ASP.NET都知道如何处理URL


上述方法意味着,当请求静态文件时,ASP.NET实际上是在为文件服务,而不是IIS——这导致了一些缺点(已讨论)。您可以通过将目录切换到应用程序(在IIS管理器中)、删除通配符映射语句(添加在上面)并将其从应用程序切换回来覆盖此行为(从静态目录禁用通配符映射)。瞧,静态文件是由IIS处理的,不会打扰你的ASP.NET。

首先,我同意Jonathan Wood之前的文章,在HttpHandler中使用路由不是一个好主意。但我很确定他指的是那里的标准MVC路由


一个好的方法是使用自定义路由。我发表了一篇关于它的文章-

你能解释一下“我不会为它使用HTTP处理程序”吗?据我所知,HTTP处理程序提供了比普通ASPX页面更好的性能,我不认为HTTP处理程序方式有任何缺点。页面路由更直接,提供了更大的灵活性。它的设计正是为了你所描述的。HTTP处理程序可能更快,但这是因为对ASP.NET页面的部分支持未运行/加载。我刚刚实现了一个自定义HTTP处理程序。它工作得很好。但我认为这不是你描述的正确方法。谢谢你的回复。。。你能更详细地阐述一下“直截了当、更灵活”的含义吗?我认为HTTP处理程序的方法非常简单和直接。此外,您能否更具体地描述一下URL路由解决方案的外观?鲁杜的回答非常详细。再次感谢乔纳森。可能是真的,但对遗留问题没有帮助。
<httpHandlers>
  <add verb="*" path="*" type="Example.MyHandler"/>
</httpHandlers>
<httpHandlers>
  <add verb="*" path="*" type="Example.MyHandler"/>
  <add verb="GET,HEAD" path="static/*" type="System.Web.StaticFileHandler" />
</httpHandlers>