如何创建自定义httpHandler并将其添加到现有IIS网站

时间:2017-07-07 19:44:03

标签: c# iis httphandler

我需要将自定义httpHandler添加到现有的IIS WebSite。我有一个带有IIS的Windows Server 2012 R2,在IIS中我有一个运行ASP.NET解决方案的WebSite,我无权访问这些源。 ApplicationPool配置为使用.Net 4.0和集成模式运行。

我们希望将自定义httpHandler开发为.dll,并在Handler Mappings下的WebSite中注册。为此,我们在Visual Studio 2015中创建了一个新的Dynamic Linked Libary项目,其代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;

namespace MinimalStandaloneHttpHandler
{
    public class Class1 : IHttpHandler
    {
        public Class1()
        {

        }

        public void ProcessRequest(HttpContext context)
        {
            HttpRequest Request = context.Request;
            HttpResponse Response = context.Response;
            // This handler is called whenever a file ending 
            // in .sample is requested. A file with that extension
            // does not need to exist.

            context.Server.Transfer("http://www.google.com", false);
        }

        public bool IsReusable
        {
            // To enable pooling, return true here.
            // This keeps the handler in memory.
            get { return false; }
        }

    }
}

我们编译了它并转到了IIS - >网站 - >处理程序映射 - >添加通配符脚本映射。

我们在这里添加了" *"作为请求路径,.dll的完整路径和友好名称。在Handler Mappings下 - >我的处理程序 - >右键单击 - >请求限制 - >映射 - >未选中"仅在请求映射到以下时调用处理程序:"。

处理程序现在列在启用的处理程序下。现在web.config被修改了:

<configuration>
    <system.webServer>
        <handlers>
            <add name="asdasd" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\inetpub\wwwroot\WebSiteStaticTest\MinimalStandaloneHttpHandler.dll" resourceType="File" requireAccess="None" preCondition="bitness32" />
        </handlers>
    </system.webServer>
</configuration>

但是当我们在网站上执行该页面时,处理程序似乎不起作用,因为我们没有被重定向到Google。这有什么不对?

1 个答案:

答案 0 :(得分:1)

我发现您在要回复所有请求的路径中使用了*。 HTTPhandler通常用作端点,您可以在其中注册特定类型的请求,例如* .mspx,其中所有类型的mspx请求(default.mspx,home.mspx etc()都会到您的处理程序执行。来自MSDN < / p>

  

ASP.NET HTTP处理程序是一个进程(通常称为   响应对ASP.NET Web发出的请求而运行的“端点”   应用。最常见的处理程序是ASP.NET页面处理程序   进程.aspx文件。

你真正需要的是一个HTTPModule,它将挂钩每个请求并做出响应。

  

HTTP模块是在每个请求上调用的程序集   根据你的申请。

请查看this,这是一个示例实现。

using System;
using System.Web;
public class HelloWorldModule : IHttpModule
{
    public HelloWorldModule()
    {
    }

    public String ModuleName
    {
        get { return "HelloWorldModule"; }
    }

    // In the Init function, register for HttpApplication 
    // events by adding your handlers.
    public void Init(HttpApplication application)
    {
        application.BeginRequest += 
            (new EventHandler(this.Application_BeginRequest));

    }

    private void Application_BeginRequest(Object source, 
         EventArgs e)
    {
    // Create HttpApplication and HttpContext objects to access
    // request and response properties.
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        context.Response.Redirect("http://www.google.com", false);
    }


    public void Dispose() { }
}

并像这样注册模块

<configuration>
<system.webServer><modules><add name="HelloWorldModule" type="HelloWorldModule"/></modules></system.webServer>
</configuration>

你也可以添加一个通配符处理程序(就像你做的那样),但是asp.net中有许多其他处理程序可以在你的处理程序获取之前干扰请求。检查thisthis

请注意,您在代码中使用Server.Transfer将请求转移到goole.com,这是不可能的。服务器传输只能用于在同一请求上下文中传输请求,而不能用于另一个请求上下文网站或域名