asp.net自定义HttpHandler和URL路由

时间:2010-12-01 00:46:51

标签: url routing httphandler

我想通过自定义HttpHandler处理对我的应用程序“http://example.com/whateverpath”的请求,但返回的东西取决于“whateverpath”的值。

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

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

对于这个问题,我将不胜感激。

干杯 弗兰克阿贝尔

3 个答案:

答案 0 :(得分:4)

因此,您有一个实现名为IHttpHandler的{​​{1}}的类,并且它位于名称空间MyHandler中,您需要在网站的Example中进行以下输入httpHandlers部分:

Web.Config

由于这会将您的网站/应用程序的所有URL重定向到处理程序,因此您必须考虑如何提供静态内容(imgs,脚本,样式表等)。一种方法是将此类静态内容存储在一致的URL中,例如<httpHandlers> <add verb="*" path="*" type="Example.MyHandler"/> </httpHandlers> ,然后您可以将处理程序设置为:

http://example.com/static/...

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

  • 打开:IIS管理器 - &gt;
  • 部分:网站 - &gt;
  • 右键点击您的网站 - &gt;
  • 选项:属性 - &gt;
  • Tab:Home Directoy - &gt;
  • 按钮:[配置...] - &gt;
  • 标签:映射 - &gt;
  • 部分:“通配符应用程序映射(实现顺序):” - &gt;
  • 按钮:[插入...] - &gt;
  • 可执行文件:“C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_isapi.dll”(或您的处理程序使用的.NET运行时版本) - &gt;
  • 取消选中“验证该文件是否存在” - &gt;
  • 按钮:[确定]

现在,IIS和ASP.NET都知道如何处理您的URL。

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

答案 1 :(得分:0)

我不建议组合URL路由和HTTP处理程序。

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

只需将“〜/ CustomData / whateverpath”映射到ASPX页面即可。然后让页面加载数据库中的数据。毕竟,如果查询数据的逻辑是相同的,无论“无论什么路径”是什么,你都不想为每个变化重复你的逻辑。相反,您希望将其映射到单个文件,该文件将为所有情况加载正确的数据。

HTTP处理程序是完全不同的事情,不应该用于此目的。 (顺便说一下,我刚刚发表了一篇关于HTTP处理程序的文章。你可以在http://www.blackbeltcoder.com/Articles/asp/writing-a-custom-http-handler-in-asp-net查看它。)

答案 2 :(得分:0)

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

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