Web services 在IIS中的虚拟目录上使用HTTP模块
我在IIS中有一个默认网站,我在其中创建了一个虚拟目录“wsdls” 我想收集有多少请求被触发到我的虚拟目录的统计信息。这需要在web服务器级别拦截请求并收集统计数据。“HTTPModule”是我考虑过的许多适合此类场景的解决方案之一。因此我开始建造一个 出于测试目的,我想创建一个HTTP模块,并将其应用于特定的扩展文件(比如*.wsdl),并且在这个虚拟目录中任何.wsdl文件的每个GET请求上,我都想将应用程序重定向到“www.google.com”。这将演示如何在IIS上使用和部署HTTP模块 使用Visual Studio编写的HTTPModule如下所示Web services 在IIS中的虚拟目录上使用HTTP模块,web-services,iis,wsdl,Web Services,Iis,Wsdl,我在IIS中有一个默认网站,我在其中创建了一个虚拟目录“wsdls” 我想收集有多少请求被触发到我的虚拟目录的统计信息。这需要在web服务器级别拦截请求并收集统计数据。“HTTPModule”是我考虑过的许多适合此类场景的解决方案之一。因此我开始建造一个 出于测试目的,我想创建一个HTTP模块,并将其应用于特定的扩展文件(比如*.wsdl),并且在这个虚拟目录中任何.wsdl文件的每个GET请求上,我都想将应用程序重定向到“www.google.com”。这将演示如何在IIS上使用和部署HTT
namespace Handler.App_Code
{
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));
application.EndRequest +=
(new EventHandler(this.Application_EndRequest));
}
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("www.google.com");
}
private void Application_EndRequest(Object source, EventArgs e)
{
//Nothing to be done here
}
public void Dispose() { }
}
}
现在我已经为x64版本完成了这个项目的构建,我能够成功地浏览“dll”文件。现在我必须在IIS中注册这个dll,每当我尝试访问*.wsdl文件时,请求会自动转移到“www.google.com”。这是我做的下一步
然后我启用了如下所示的处理程序映射
namespace Handler.App_Code
{
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));
application.EndRequest +=
(new EventHandler(this.Application_EndRequest));
}
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("www.google.com");
}
private void Application_EndRequest(Object source, EventArgs e)
{
//Nothing to be done here
}
public void Dispose() { }
}
}
我想是这样吧!!没有更多的事情要做。我应该能够拦截所有HTTP请求的请求,这些请求的格式为“*.wsdl”。这意味着每当我从服务器访问任何wsdl时,控制权都应该回到google(因为begin请求中写入了逻辑)。但不幸的是,我没能做到这一点。这里可以做什么?我注意到的一件事是,当您试图重定向到外部URL时,请使用 http:// 所以改变 context.Response.Redirect(“www.google.com”); 到
context.Response.Redirect(“,true) 我可以解决我所面临的问题,下面是我理解中缺失的观察结果,这些观察结果帮助我解决了问题: 查找正确的web.config文件:
- IIS中的每个网站都将有一个web.config文件来控制应用程序
- 因为我使用的是“默认网站”,所以这指的是目录
“C:\\inetpub\\wwwroot”
- 此控制器中将存在一个“web.config”文件。如果尚未出现,请创建它
- 一旦确定了需要修改的文件,只需将必要的模块配置添加到web.config
- 在这种情况下,我们希望向默认网站添加一个模块,可能的设置如下所示
- 现在,如果您尝试运行应用程序,IIS将找不到任何要运行的dll或可执行文件,因此我们需要将可执行文件保留在特定位置
- 如果尚未在目录根目录中显示名称“bin”,请创建一个控制器,并放置希望此网站执行的所有DLL。样本如下所示
- 必须为包含dll的文件夹提供正确的访问权限
- 最好不要修改整个网站。如果只在web应用程序上工作,这将是理想的
- 如果找不到web.config,我们可以创建一个
- 如果bin不在web根目录中,我们可以创建一个