标签: httpmodule

HTTP处理程序与HTTP模块

有人能用不到2句话解释两者之间的区别吗?是的,我知道谷歌可以提供数百个答案但不是一个2个明确的句子:)

asp.net httphandler httpmodule

140
推荐指数
5
解决办法
7万
查看次数

我可以从HTTPModule访问会话状态吗?

我真的可以从我的HTTPModule中更新用户的会话变量,但从我所看到的,它是不可能的.

更新:我的代码当前正在OnBeginRequest ()事件处理程序中运行.

更新:根据目前为止收到的建议,我尝试将其添加到Init ()我的HTTPModule例程中:

AddHandler context.PreRequestHandlerExecute, AddressOf OnPreRequestHandlerExecute

但在我的OnPreRequestHandlerExecute日常工作中,会话状态仍然不可用!

谢谢,如果我错过了什么,道歉!

asp.net session-state httpmodule

85
推荐指数
4
解决办法
6万
查看次数

IHttpHandler vs IHttpModule

我的问题很简单(虽然答案很可能不是):我正在尝试决定如何在C#/ ASP.NET中实现服务器端上传处理程序.

我已经使用了HttpModules(IHttpModule接口)和HttpHandlers(IHttpHandler接口),我发现我可以使用这两种机制来实现它.我也想到,我不明白两者之间的差异.

所以我的问题是: 在什么情况下我会选择使用IHttpHandler而不是IHttpModule(反之亦然)?

一个人在管道中执行得更高吗?在某些情况下更容易配置吗?一个人不适合中等安全性吗?

c# asp.net iis httphandler httpmodule

79
推荐指数
5
解决办法
2万
查看次数

HTTPModule事件执行命令?

有没有人知道某个站点或页面,或者知道HTTPModule事件执行的HTTPApplication类事件的执行顺序?

我找到了所有事件的MSDN文档,但它没有显示进程步骤列表,但我找不到.

asp.net httpmodule httpapplication

59
推荐指数
2
解决办法
4万
查看次数

为什么我的嵌套HttpModule EndRequest事件处理程序不会触发?

当我尝试EndRequest使用嵌套HttpModule在MVC 5.2.2和.NET 4.6.2上的事件处理程序修改标头时,我有一些奇怪的行为.如果我不在EndRequest我的顶级修改HttpModule,看起来嵌套中的事件处理程序HttpModule永远不会触发,即使我知道Init在嵌套上调用了HttpModule.

我的问题是,我的代码中发生了什么,以防止"TestNested"标题出现在响应头中,除非我包含添加了一个EndRequest什么都不做的事件处理程序的注释掉的代码?


动态注册我的顶级 HttpModule

[assembly: PreApplicationStartMethod(typeof(PreApplicationStartClass), "Start")]
namespace MyNamespace
{
    public class PreApplicationStartClass
    {
        public static void Start()
        {
            DynamicModuleUtility.RegisterModule(typeof(TopHttpModule));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

从单个顶级模块调用Init我的所有其他HttpModules模块

namespace MyNamespace
{
    public class TopHttpModule: IHttpModule
    {
        private readonly Lazy<IEnumerable<IHttpModule>> _modules = 
            new Lazy<IEnumerable<IHttpModule>>(RetrieveModules);

        private static IEnumerable<IHttpModule> RetrieveModules()
        {
            return DependencyResolver.Current.GetServices<IHttpModule>();
        }

        public void Init(HttpApplication context)
        {
            var modules = _modules.Value;
            foreach (var …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc httpmodule

59
推荐指数
1
解决办法
3845
查看次数

无法加载文件或程序集"msshrtmi"或其依赖项之一(Azure表存储访问)

我有一个HTTPModule,用于重定向数据中心的网站和Azure平台上运行的网站之间的流量.此HTTPModule从Azure表存储中检索其重定向规则.

重定向在我的本地开发计算机上以及在Azure上运行时都能正常工作.但是,当我将模块部署到我的数据中心服务器(IIS 7,WS 2008 R2标准64位,.NET 4.0,ASP.NET 4.0)时,我收到以下错误

Parser Error Message: Could not load file or assembly 'msshrtmi' or one of its dependencies. An attempt was made to load a program with an incorrect format.
Line 124:                <add assembly="System.Web.DynamicData, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
Line 125:                <add assembly="System.Web.ApplicationServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
Line 126:                <add assembly="*" />
Line 127:            </assemblies>
Line 128:            <buildProviders>

Source File: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config    Line: 126 
Run Code Online (Sandbox Code Playgroud)

"msshrtmi.dll"实际存在于我的部署bin目录中.

如果我删除此dll数据中心站点工作正常,但HTTPModule无法从表存储加载其配置数据,而是抛出以下错误

---> System.TypeInitializationException: The type initializer for 'Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment' threw an exception. ---> System.IO.FileNotFoundException: Could …
Run Code Online (Sandbox Code Playgroud)

.net c# httpmodule azure azure-storage

49
推荐指数
3
解决办法
4万
查看次数

以编程方式在运行时注册HttpModules

我正在编写一个应用程序,第三方供应商可以编写插件DLL并将其放入Web应用程序的bin目录中.我希望这些插件能够在必要时注册自己的HttpModule.

无论如何,我可以在运行时向管道添加或删除HttpModule,而无需在Web.Config中有相应的条目,或者在添加/删除模块时是否必须以编程方式编辑Web.Config?我知道无论哪种方式都会导致AppDomain重启,但我宁愿能够在代码中执行它,而不是为了实现相同的效果而捏造web.config.

asp.net web-config httpmodule

44
推荐指数
3
解决办法
2万
查看次数

如何确定HttpModules的执行顺序?

假设双方FirstModuleSecondModule处理Application_BeginRequest事件.它会按web.config中定义的顺序执行吗?

<httpModules>
  <add type="MyApp.FirstModule, MyApp" name="FirstModule"/>
  <add type="MyApp.SecondModule, MyApp" name="SecondModule"/>
  <add type="OtherApp.OtherModule, OtherApp" name="OtherModule"/>
</httpModules>
Run Code Online (Sandbox Code Playgroud)

是否有其他方式可以指定订单?

asp.net web-config httpmodule

34
推荐指数
1
解决办法
8519
查看次数

几次调用HttpModule Init方法 - 为什么?

我正在创建一个http模块,在调试时我注意到一些东西,起初(至少)看起来像是奇怪的行为.

当我在httpmodule的init方法中设置断点时,我可以看到http模块初始化方法被多次调用,即使我只是启动了网站进行调试并发出了一个单一请求(有时它只被命中一次) ,其他时间多达10次).

我知道我应该期望HttpApplication的几个实例正在运行,并且每个http模块都将被创建,但是当我请求单个页面时,它应该由单个http应用程序对象处理,因此只触发关联一次的事件,但是它仍然会为每个请求多次触发事件,这是没有意义的 - 除了它必须在httpApplication中多次添加 - 这意味着它是每次调用的相同的httpmodule init方法而不是新的http应用程序每次碰到我的断点时都会被创建(请参阅底部的代码示例等).

这可能会出错?是因为我正在调试并在http模块中设置断点?

它已经注意到,如果我启动网站进行调试并快速跳过httpmodule中的断点,它只会触发一次init方法,而事件处理程序也是如此.如果我让它在断点处挂起几秒钟,则会多次调用init方法(看起来这取决于我在跨越断点之前等待多长时间).也许这可能是一些内置功能,以确保httpmodule已初始化,http应用程序可以提供请求,但它似乎也可能产生灾难性后果.

这似乎是合乎逻辑的,因为它可能正在尝试完成请求,因为我设置了断点,它认为出了问题,并尝试再次调用init方法?它可以处理请求吗?

但这是发生了什么,一切都很好(我只是猜测),还是一个真正的问题?

我特别关注的是,如果有什么东西让它挂在"生产/实时"服务器上几秒钟,那么很多事件处理程序都会通过init添加,因此每次对页面的请求都会突然激活事件处理程序几次.

此行为可能会迅速导致任何网站崩溃.

我查看了用于formauthentication和rolemanagermodule等的httpmodules的"原始".net代码,但我的代码与这些模块使用的代码不同.

我的代码看起来像这样.

    public void Init(HttpApplication app)
    {
        if (CommunityAuthenticationIntegration.IsEnabled)
        {
            FormsAuthenticationModule formsAuthModule = (FormsAuthenticationModule) app.Modules["FormsAuthentication"];         

            formsAuthModule.Authenticate += new FormsAuthenticationEventHandler(this.OnAuthenticate);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是一个如何在.NET框架的RoleManagerModule中完成它的示例

    public void Init(HttpApplication app)
    {
        if (Roles.Enabled)
        {
            app.PostAuthenticateRequest += new EventHandler(this.OnEnter);
            app.EndRequest += new EventHandler(this.OnLeave);
        }
    }
Run Code Online (Sandbox Code Playgroud)

有谁知道发生了什么?

(我只希望有人可以告诉我为什么会这样,并向我保证一切都很好):)


更新:

我试图缩小问题的范围,到目前为止,我发现被调用的Init方法总是在我的http模块的一个新对象上(与我之前想到的一致).

我似乎对于第一个请求(启动站点时)所有正在创建的HttpApplication对象及其模块都试图为第一个请求提供服务,因此所有HttpApplication都会触发正在添加的事件处理程序.我无法弄清楚为什么会这样.

如果我请求另一个页面,所有创建的HttpApplication(以及它们的无模块)将再次尝试提供请求,使其多次命中eventhandler.

但似乎如果我然后跳回到第一页(或另一个),只有一个HttpApplication将开始处理请求,一切都按预期 - 只要我不让它挂在断点.

如果我让它在断点处挂起它开始创建新的HttpApplication对象并开始添加HttpApplications(超过1)来提供/处理请求(已经在HttpApplication服务的过程中,当前在断点处停止) .

我想或希望它可能是一些帮助分发和处理负载和/或错误的智能"幕后"方式.但我不知道.我希望有些人可以向我保证它完全没问题,它应该如何?

.net c# init httpmodule

31
推荐指数
2
解决办法
2万
查看次数

如何使用HttpModule记录请求输入流,然后重置InputStream位置

我正在尝试使用像这样的IHttpModule记录http请求的内容:

public class LoggingModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += ContextBeginRequest;
    }

    private void ContextBeginRequest(object sender, EventArgs e)
    {
        var request = ((HttpApplication)sender).Request;
        string content;

        using (var reader = new StreamReader(request.InputStream))
        {
            content = reader.ReadToEnd();
        }

        LogRequest(content)
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,在将输入流读取到结尾后,InputStream似乎已消失或更有可能,光标位于流的末尾.

我尝试过request.InputStream.Position = 0;,request.InputStream.Seek(0, SeekOrigin.Begin);但都没有工作.

.net inputstream httpmodule

31
推荐指数
2
解决办法
2万
查看次数