如何仅针对特定页面类型在fire事件上设置http模块

时间:2008-12-01 16:47:40

标签: asp.net sharepoint sharepoint-2007 httpmodule

我在sharepoint站点上有一个http模块,该模块实例化一个自定义类并将其添加到会话中,并为我的站点执行其他初始操作。 但是,我注意到正在为所有请求类型(.aspx,.js,.png,.jpg)调用http模块。

有没有办法只为.net特定页面类型调用http模块?

6 个答案:

答案 0 :(得分:0)

在IIS中,您将设置与特定扩展名关联的处理程序,以便处理程序仅应用于该扩展名。不应处理JavaScript文件。

答案 1 :(得分:0)

我还要看看this article您是否正在考虑以任何方式将模块/处理程序与SharePoint集成。

答案 2 :(得分:0)

虽然我确实喜欢这种类型的http处理程序的易部署(以及您不必为处理程序部署web.config条目这一事实),但在您可能不想使用_layouts目录的情况下或者你想拥有一个自定义文件扩展名,这里有一个可行的替代方法(尽管它在IIS中需要一个手动配置步骤,因此它可能不适合“无接触部署”)

1)像往常一样为asp.net应用程序创建你的http处理程序。您可以添加对SharePoint DLL的引用,并与对象模型进行交互,因为您位于应用程序池中。

2)添加并输入您的web.config以注册您的处理程序并定义您要使用的扩展程序。 IE:

3)通过IIS>在IIS中定义自定义扩展。 Web SIte Properties>主页目录>配置>映射

在这种情况下,我们定义了一个处理程序将获取的.proxy扩展名。我们的处理程序是一个.NET程序集,所以我们需要添加映射以将.proxy请求路由到.net isapi dll(C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_isapi.dll)..同时,make确定你取消检查“

来自http://msdn.microsoft.com/en-us/library/bb457204.aspx的评论

答案 3 :(得分:0)

我做了一些研究,似乎没有办法做我想要的事情。 我将不得不检查请求类型并从那里取消。

感谢大家的回答。

d

答案 4 :(得分:0)

您可以通过检查最后一个Uri.Segments内容中的扩展名,使用HttpModule(在对昂贵的SharePoint对象模型进行任何调用之前)以非常轻量级的方式执行此操作

void context_BeginRequest(object sender, EventArgs e)
{
    HttpApplication app = (HttpApplication)sender;
    Uri uri = app.Request.Url;
    string lastSegment = uri.Segments[uri.Segments.Length-1];
    .. check your extension here an do nothing if it doesn't match.
    ..
}

我们在SharePoint的'TinyURL'实现中使用它,以确保对常规URL的性能影响几乎为0.

答案 5 :(得分:0)

以下是一些如何按扩展名过滤请求的简单示例...以下示例从具有特定扩展名的处理文件中排除。

public class AuthenticationModule : IHttpModule
{
    private static readonly List<string> extensionsToSkip = AuthenticationConfig.ExtensionsToSkip.Split('|').ToList();

    // 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)
    {
        //  we don't have to process all requests...
        if (extensionsToSkip.Contains(Path.GetExtension(HttpContext.Current.Request.Url.LocalPath)))
            return;

        Trace.WriteLine("Application_BeginRequest: " + HttpContext.Current.Request.Url.AbsoluteUri);
    }

    private void Application_EndRequest(Object source, EventArgs e)
    {
        //  we don't have to process all requests...
        if (extensionsToSkip.Contains(Path.GetExtension(HttpContext.Current.Request.Url.LocalPath)))
            return;

        Trace.WriteLine("Application_BeginRequest: " + HttpContext.Current.Request.Url.AbsoluteUri);
    }
}

在配置文件中指定应排除哪些扩展名并启动模块中的扩展名列表。