【问题标题】:asp.net custom HttpHandler and URL routingasp.net 自定义 HttpHandler 和 URL 路由
【发布时间】:2011-05-18 05:47:48
【问题描述】:

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

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

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

我将感谢任何关于此问题的评论。

干杯 弗兰克·阿贝尔

【问题讨论】:

    标签: url routing httphandler


    【解决方案1】:

    我不建议将 URL 路由和 HTTP 处理程序结合使用。

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

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

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

    【讨论】:

    • 你能解释一下“我不会为此使用 HTTP 处理程序。”吗?据我所知,HTTP 处理程序提供比普通 ASPX 页面更好的性能,而且我没有看到 HTTP 处理程序方式的任何缺点。
    • 页面路由更直接,提供更大的灵活性。它专为您所描述的而设计。 HTTP 处理程序可能更快,但这是因为对 ASP.NET 页面的部分支持没有运行/加载。我刚刚完成了一个自定义 HTTP 处理程序的实现。它工作得很好。但我认为这不是您所描述的正确方法。
    • 感谢您的回复...您能否详细说明“直截了当并提供更多灵活性”的含义?我看到 HTTP 处理程序方法非常简单直接。此外,您能否更具体地说明 URL 路由解决方案的外观? Rudu的回答非常详细。再次感谢乔纳森。
    • 可能是真的,但对遗留情况没有帮助。
    【解决方案2】:

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

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

    由于这会将您的网站/应用程序的所有 URL 重定向到您的处理程序,您必须考虑如何提供静态内容(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 管理器 ->
    • 部分:网站 ->
    • 在你的网站上右击->
    • 选项:属性 ->
    • 选项卡:主目录 ->
    • 按钮:[配置...] ->
    • 选项卡:映射 ->
    • 部分:“通配符应用映射(实施顺序):”->
    • 按钮:[插入...] ->
    • 可执行文件:“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll”(或您的处理程序使用的任何版本的 .NET 运行时)->
    • 取消选中“验证文件是否存在”->
    • 按钮:[确定]

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-04-08
        • 1970-01-01
        • 2014-05-31
        • 1970-01-01
        • 2015-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-02
        相关资源
        最近更新 更多