3

我创建了一个简单的 HttpModule 来记录我现有 Web 服务的使用情况。有一个包含单个类的 dll

public class TrackingModule : System.Web.IHttpModule
{
    public TrackingModule(){}

    public void Init(System.Web.HttpApplication context)
    {
        context.BeginRequest+=new EventHandler(context_BeginRequest);
    }

    public void Dispose()
    {

    }

    private void context_BeginRequest(object sender, EventArgs e)
    {
        try
        {
            Microsoft.ApplicationBlocks.ExceptionManagement.ExceptionManager.Publish( new Exception("Log attept") );
            HttpApplication app = (HttpApplication)sender;
            string method = app.Request.RawUrl;
            SaveUseToDatabase( app.Request.UserHostAddress, method );
        }
        catch( Exception ex )
        {
            try
            {
                Microsoft.ApplicationBlocks.ExceptionManagement.ExceptionManager.Publish( ex );
            }
            catch{}
        }
    }
}

编译完 dll 后,我将它添加到 webservice 的 bin 文件夹中,并在 webservice 的 web.config 中添加:

<system.web>
    <httpModules>
       <add name="TrackingModule" type="WebserviceTrackingModule.TrackingModule, WebserviceTrackingModule"/>

这在我的计算机上运行良好,但是当我将其复制到生产服务器时,什么也没有发生。数据库中没有新条目,ExceptionManager 没有记录任何条目。就好像它根本不存在一样。

我能错过什么?

编辑:在执行另一个测试后,我可以添加它在我为拥有自己的顶级虚拟目录的 web 服务添加它时工作。它不适用于驻留在作为另一个虚拟目录的子文件夹的虚拟目录中的 Web 服务。

我知道 HttpModules 设置被子目录继承,但看起来父目录的存在妨碍了。

4

4 回答 4

3

我相信我找到了更好的解决方案。在运行时而不是在 Web 配置中附加模块。查看Rick Strahl 的博客文章了解详细信息。

于 2009-02-27T15:04:01.993 回答
1

好的,我正在回答我自己的问题。

当您在子目录的 web.config 中定义 <httpModules> 时,它不起作用,即使子目录配置为应用程序也是如此。到目前为止,我发现的唯一解决方案是在根应用程序(父目录)的 web.config 中的 <location> 标记中定义它们。

我不喜欢它:(

于 2008-12-19T09:32:33.447 回答
1

我在http://forums.iis.net/t/1151924.aspx找到了这个问题的答案

哦,好吧,一个小小的消除过程永远不会让我失望。

看了看 3.5 相关的 web.config 代码后,我意识到我的模块需要添加到新的部分:

<system.webserver>

    <模块>

而不是 system.web ......至少它现在正在工作。

所以翻译一下:

如果您在使用 httphandlers 时遇到问题

将您的处理程序添加到 system.webserver 中的模块节点,看看是否有效复制用于 scriptmodule 的格式。

于 2009-02-26T10:56:42.283 回答
0

这行得通吗?

<add name="TrackingModule" type="WebserviceTrackingModule.TrackingModule" />

并且每个请求都肯定会调用 context_BeginRequest 方法吗?

于 2008-12-18T15:15:07.483 回答