有人能用不到2句话解释两者之间的区别吗?是的,我知道谷歌可以提供数百个答案但不是一个2个明确的句子:)
我真的可以从我的HTTPModule中更新用户的会话变量,但从我所看到的,它是不可能的.
更新:我的代码当前正在OnBeginRequest ()事件处理程序中运行.
更新:根据目前为止收到的建议,我尝试将其添加到Init ()我的HTTPModule例程中:
AddHandler context.PreRequestHandlerExecute, AddressOf OnPreRequestHandlerExecute
但在我的OnPreRequestHandlerExecute日常工作中,会话状态仍然不可用!
谢谢,如果我错过了什么,道歉!
我的问题很简单(虽然答案很可能不是):我正在尝试决定如何在C#/ ASP.NET中实现服务器端上传处理程序.
我已经使用了HttpModules(IHttpModule接口)和HttpHandlers(IHttpHandler接口),我发现我可以使用这两种机制来实现它.我也想到,我不明白两者之间的差异.
所以我的问题是: 在什么情况下我会选择使用IHttpHandler而不是IHttpModule(反之亦然)?
一个人在管道中执行得更高吗?在某些情况下更容易配置吗?一个人不适合中等安全性吗?
有没有人知道某个站点或页面,或者知道HTTPModule事件执行的HTTPApplication类事件的执行顺序?
我找到了所有事件的MSDN文档,但它没有显示进程步骤列表,但我找不到.
当我尝试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) 我有一个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) 我正在编写一个应用程序,第三方供应商可以编写插件DLL并将其放入Web应用程序的bin目录中.我希望这些插件能够在必要时注册自己的HttpModule.
无论如何,我可以在运行时向管道添加或删除HttpModule,而无需在Web.Config中有相应的条目,或者在添加/删除模块时是否必须以编程方式编辑Web.Config?我知道无论哪种方式都会导致AppDomain重启,但我宁愿能够在代码中执行它,而不是为了实现相同的效果而捏造web.config.
假设双方FirstModule和SecondModule处理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)
是否有其他方式可以指定订单?
我正在创建一个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服务的过程中,当前在断点处停止) .
我想或希望它可能是一些帮助分发和处理负载和/或错误的智能"幕后"方式.但我不知道.我希望有些人可以向我保证它完全没问题,它应该如何?
我正在尝试使用像这样的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);但都没有工作.
httpmodule ×10
asp.net ×6
c# ×4
.net ×3
httphandler ×2
web-config ×2
asp.net-mvc ×1
azure ×1
iis ×1
init ×1
inputstream ×1