我需要将自定义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。这有什么不对?
答案 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中有许多其他处理程序可以在你的处理程序获取之前干扰请求。检查this,this
请注意,您在代码中使用Server.Transfer将请求转移到goole.com,这是不可能的。服务器传输只能用于在同一请求上下文中传输请求,而不能用于另一个请求上下文网站或域名