我创建了一个简单的HttpModule来记录我现有的webservice的用法。有一个包含单个类的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没有记录任何条目。好像它根本不在那里。
我能错过什么?
编辑: 在执行另一个测试之后,我可以添加它,当我为具有它自己的顶级虚拟目录的webservice添加它时它可以工作。它不适用于驻留在作为另一个虚拟目录的子文件夹的虚拟目录中的Web服务。
我知道子目录正在继承HttpModules设置,但看起来父目录的存在会妨碍。
答案 0 :(得分:3)
我相信我找到了更好的解决方案。在运行时而不是在Web配置中附加模块。查看Rick Strahl's blog post了解详细信息。
答案 1 :(得分:1)
好的,我正在回答我自己的问题。
定义&lt; httpModules&gt;时,它不起作用在子目录的web.config中,即使子目录被配置为应用程序。到目前为止我找到的唯一解决方案是在&lt; location&gt;内定义它们。在根应用程序(父目录)的web.config中标记。
我不喜欢它:(
答案 2 :(得分:1)
我在http://forums.iis.net/t/1151924.aspx
中找到了这个问题的答案噢,好吧,有点 消除过程永远不会失败 我盯着3.5相关 web.config代码,我意识到我的 模块需要添加到新的 部分:
&LT; system.webserver&GT;
&LT;模块&gt;
而不是system.web ...至少它是 现在正在工作。
所以翻译一下:
如果您遇到httphandlers问题
将您的处理程序添加到system.webserver中的modules节点,看看是否有效 复制用于scriptmodule的格式。
答案 3 :(得分:0)
这有用吗?
<add name="TrackingModule" type="WebserviceTrackingModule.TrackingModule" />
是否肯定会为每个请求调用context_BeginRequest方法?