Web services 在IIS中的虚拟目录上使用HTTP模块

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

我在IIS中有一个默认网站,我在其中创建了一个虚拟目录“wsdls”

我想收集有多少请求被触发到我的虚拟目录的统计信息。这需要在web服务器级别拦截请求并收集统计数据。“HTTPModule”是我考虑过的许多适合此类场景的解决方案之一。因此我开始建造一个

出于测试目的,我想创建一个HTTP模块,并将其应用于特定的扩展文件(比如*.wsdl),并且在这个虚拟目录中任何.wsdl文件的每个GET请求上,我都想将应用程序重定向到“www.google.com”。这将演示如何在IIS上使用和部署HTTP模块

使用Visual Studio编写的HTTPModule如下所示

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:

  • 一旦确定了需要修改的文件,只需将必要的模块配置添加到web.config
  • 在这种情况下,我们希望向默认网站添加一个模块,可能的设置如下所示
向bin目录添加内容:

  • 现在,如果您尝试运行应用程序,IIS将找不到任何要运行的dll或可执行文件,因此我们需要将可执行文件保留在特定位置
  • 如果尚未在目录根目录中显示名称“bin”,请创建一个控制器,并放置希望此网站执行的所有DLL。样本如下所示

需要考虑的一般要点:

  • 必须为包含dll的文件夹提供正确的访问权限
  • 最好不要修改整个网站。如果只在web应用程序上工作,这将是理想的
  • 如果找不到web.config,我们可以创建一个
  • 如果bin不在web根目录中,我们可以创建一个

如果我是你,我会使用IIS日志文件获取命中率,而不是编写模块。我的要求是拦截每个请求,并将请求详细信息发布到另一个应用程序,该应用程序收集信息并将其放入数据库。其中一种方法是使用HTTP模块,我不想把我的全部需求都写下来,从而使人们变得复杂。我正在处理这个问题,在IIS上应用HTTP模块时遇到了一个问题,这就是本文的原因。在我看来,“点击次数”可能只是一个例子,但IIS上的“HTTP模块”使用是必需的。谢谢。但这对我没有帮助Kaushik。