asp.net 如何让HTTP模块只针对特定的页面类型触发事件[重复]

laik7k3q  于 2023-05-19  发布在  .NET
关注(0)|答案(5)|浏览(122)

此问题已在此处有答案

Exclude certain pages from using a HTTPModule(3个答案)
7年前关闭。
我在sharepoint网站上有一个http模块,这个模块示例化一个自定义类,并将其添加到会话中,并为我的网站做其他初始化的事情。然而,我注意到所有请求类型(.aspx、.js、.png、.jpg)都调用了http模块。
有没有什么方法可以让http模块只被特定于.net的页面类型调用?

bt1cpqcv

bt1cpqcv1#

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

vfwfrxfs

vfwfrxfs2#

虽然我确实喜欢这种类型的http处理程序部署的简易性(而且您不必为处理程序部署web.config条目),但在您可能不想使用_layouts目录或希望具有自定义文件扩展名的情况下,这里有一种替代方法也可以工作(尽管它在IIS中需要一个手动配置步骤,因此它可能不适合“无接触部署”)
1)按照通常为www.example.com应用程序所做的那样创建http处理程序asp.net。您可以添加对SharePoint DLL的引用并与对象模型交互,因为您在应用程序池中。
2)在web.config中添加和条目以注册处理程序并定义要使用的扩展。IE:
3)通过IIS > Web站点属性>主目录>配置>Map在IIS中定义自定义扩展
在本例中,我们定义了一个.proxy扩展名,处理程序将使用它。我们的处理程序是一个.NET程序集,因此我们需要添加Map以将.proxy请求路由到.net isapi dll(C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll)。此外,请确保取消选中“

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

gblwokeq

gblwokeq3#

通过检查最后一个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。

w8f9ii69

w8f9ii694#

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

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);
    }
}

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

2j4z5cfb

2j4z5cfb5#

我做了更多的研究,似乎没有办法做我打算做的事情。我将不得不检查请求类型并从那里取消。

相关问题