2010-12-01 112 views
6

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

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

我听说有关URL路由和我已经有一个自定义的Http处理程序工作,但我可以结合两种技术来得到我需要的?

我会很感激任何评论尊重这个问题。

干杯 弗兰克·亚伯

回答

4

所以,你必须实现IHttpHandler一类叫做:MyHandler和它的命名空间中的Example,你需要做下面的条目网站的Web.ConfighttpHandlers部分:

<httpHandlers> 
    <add verb="*" path="*" type="Example.MyHandler"/> 
</httpHandlers> 

因为这会将所有网址对于您的网站/应用程序,您必须考虑如何提供静态内容(imgs,脚本,样式表等)。一种方法是这样的静态内容一致的URL存储像http://example.com/static/...,那么你可以设置你的处理程序这样:

<httpHandlers> 
    <add verb="*" path="*" type="Example.MyHandler"/> 
    <add verb="GET,HEAD" path="static/*" type="System.Web.StaticFileHandler" /> 
</httpHandlers> 

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

  • 打开:IIS管理器 - >
  • 部分:网站 - >
  • 右键点击你的网站 - >
  • 选项:属性 - >
  • 标签:首页Directoy - >
  • 按钮:[Configuration ...] - >
  • Tab:映射 - >
  • 节:“通配符应用程序映射(实现顺序) :“ - >
  • Button:[Insert ...] - >
  • 可执行文件:“C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_isapi.dll”(或您的处理程序使用的任何版本的.NET运行时) - >
  • 取消选中“文件存在” - >
  • 按钮:[OK]

现在IIS和ASP.NET都知道如何对付你的URL。

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

0

我不推荐相结合的URL路由和HTTP处理程序。

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

只需将“〜/ CustomData/whateverpath”映射到ASPX页面即可。然后让页面从数据库加载数据。最后,如果查找数据的逻辑是相同的,不管什么“无论什么路径”是什么,你都不想重复你的逻辑来应对每一个变化。相反,您想将其映射到单个文件,以便为所有情况加载正确的数据。

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

+0

你能解释“我不会使用HTTP处理程序”。据我所知,HTTP处理程序比普通的ASPX页面提供更好的性能,并且我没有看到HTTP处理程序方式的任何缺点。 – 2011-01-22 01:31:44

0

首先,我会同意乔纳森伍德以前的帖子,在HttpHandler中使用路由不是一个好主意。但我很确定他指的是那里的标准MVC路由。

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