我试图编写一个简单的IHttpModule(在本例中)记录登录用户正在点击的每个页面。我尝试在多个Web应用程序中使其通用,以便它可以与几种不同类型的用户对象一起使用。
我有一个接口ILogUser
,它有一个属性:
public interface ILogUser
{
public string LoggingRef { get;}
}
我在从这个界面继承的各种Web应用程序中有几个不同的用户对象:
public class StaffMember : ILogUser
{
public int Id { get; set; }
public string Name { get; set; }
// many more properties
public string LoggingRef { get { return Name; }}
}
public class ExtranetUser : ILogUser
{
public int Id { get; set; }
public string Email { get; set; }
// many more properties
public string LoggingRef { get { return Email; }}
}
等
我的HttpModule编码如下:
public class LogVisitModule<T> : IHttpModule where T : ILogUser
{
private readonly ILog log;
public LogVisitModule()
{
log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
}
public void Init(HttpApplication app)
{
app.PostAcquireRequestState += new EventHandler(this.PostAcquireRequestState);
}
private void PostAcquireRequestState(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
HttpContext context = app.Context;
if (context.Session != null && context.Session["CurrentUser"] != null)
{
var user = (T)context.Session["CurrentUser"];
log.Info($"User {user.LoggingRef} has accessed {context.Request.FilePath}");
}
}
public void Dispose() { }
}
我使用适当的程序集属性和方法调用在我的Global.asax中动态加载模块:
[assembly: PreApplicationStartMethod(typeof(WebPortal.MvcApplication), "Start")]
public static void Start()
{
HttpApplication.RegisterModule(typeof(LogVisitModule<StaffMember>));
}
当我启动我的Web应用程序时,我收到服务器错误:
无法加载类型&#39; WebPortal.Modules.LogVisitModule&#39;。
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息:System.Web.HttpException:无法加载类型 &#39; WebPortal.Modules.LogVisitModule&#39;
来源错误:
执行期间生成了未处理的异常 当前的网络请求。有关的来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。
任何帮助将不胜感激!我希望我尝试做的事情有意义吗?我甚至不知道我所做的事情是否可行。我用Google搜索动态加载带有泛型类型的HttpModule但是找不到很多东西。