好的,所以我有一个现有的应用程序,我添加了一个自定义的HttpModule。我正在Init()方法中注册两个事件(PreRequestHandlerExecute和PostRequestHandlerExecute)。每次“正常”请求都会调用HttpModule。但是我没有创建一个包含一些WebMethod的.aspx,这些WebMethod被调用来调整一些UI组件。 WebMethod被很好地调用,但问题是我的HttpModule在访问WebMethod时根本没有被调用(没有事件,没有init,甚至没有构造函数)。当访问有问题的.aspx作为“正常”请求时,模块会被很好地调用。但是在调用WebMethod时它拒绝被调用。
我的.aspx看起来像这样:
public partial class SelectionListService : System.Web.UI.Page
{
[WebMethod]
[ScriptMethod]
public static RadComboBoxData GetItemsAsRadComboBoxData(RadComboBoxContext context)
{
...
}
}
我的HttpModule看起来像这样:
public class MyModule : IHttpModule, IRequiresSessionState
{
public MyModule ()
{
}
public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute += new EventHandler(Application_PreRequestHandlerExecute);
context.PostRequestHandlerExecute += new EventHandler(Application_PostRequestHandlerExecute);
}
private void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
...
}
private void Application_PostRequestHandlerExecute(object sender, EventArgs e)
{
...
}
}
我现在已经深入研究了一段时间,但我无法让它发挥作用。有什么想法吗?
PS1:在访问WebMethod时,会调用global.asax.cs中的BeginRequest等。 PS2:我在Windows7上运行IIS7。
答案 0 :(得分:3)
因为PageMethods必须是静态的,所以Page类的实例及其所有事件和ASP.NET管道都不会发生。您只需获得PageMethod调用的结果即可。
答案 1 :(得分:1)
我有一个项目有同样的问题。我们发现,我们可以为WebMethods
触发的管道中的第一个事件是AcquireRequestState
事件。我们使用HttpModule
与我们联系,以便进行应用程序所需的授权检查。
我不知道你的前后请求处理程序做了什么,但也许你可以把一些逻辑转移到AcquireRequestState
事件处理程序。