有没有人知道某个站点或页面,或者知道HTTPModule事件执行的HTTPApplication类事件的执行顺序?
我找到了所有事件的MSDN文档,但它没有显示进程步骤列表,但我找不到.
问1.据我所知FormsAuthenticationModule
,订阅了AuthenticateRequest
事件,因此只有在触发此事件后才会FormsAuthenticationModule
调用.但是下面的引言让我有些困惑:
该
AuthenticateRequest
事件表示配置的身份验证机制已对当前请求进行身份验证.
AuthenticateRequest
引发事件时,请求(也称为用户)已经过身份验证? 订阅
AuthenticateRequest
事件可确保在处理附加模块或事件处理程序之前对请求进行身份验证.
AuthenticatedRequest
,那么我们的事件处理程序将在之前被调用FormsAuthenticationModule
?这样Application_AuthenticateRequest()
叫之前会FormsAuthenticationModule
被称为?问2.我正在学习的书建议Application_AuthenticateRequest()
我们能够验证用户是否是特定角色的成员,如果没有,我们可以自动添加用户:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated && Roles.Enabled)
{
//here we can subscribe user to a role via Roles.AddUserToRole()
}
}
Run Code Online (Sandbox Code Playgroud)
从上面的代码判断,Application_AuthenticateRequest()
调用后FormsAuthenticationModule
调用,但在其他地方相同的书暗示Application_AuthenticateRequest()
在之前调用FormsAuthenticationModule
:
Application_AuthenticateRequest
在执行身份验证之前调用.这是创建自己的身份验证逻辑的起点.
我错过了什么?
感谢名单
c# asp.net authentication forms-authentication httpapplication
有人可以解释为什么在应用程序启动时会多次调用派生自HttpApplication的自定义类的构造函数吗?
我的代码结构如下:
- global.asax中的My Global类派生自CustomApp类.
- CustomApp类派生自HttpApplication类
在全球类是在启动时创建的,但是当我把一个断点在构造函数,调用它几次!我以为应该只创建一个Application类的实例?
我错了吗?
UPD:Web服务器确实可以创建多个HttpApplication实例来处理同时进入的多个请求.当您在HttpApplication后代的构造函数中放置断点时,这一点尤其明显.客户端将要处理几个请求(http内容,CSS文件等),并为每个请求服务,Web服务器将创建HttpApp的新实例.所以,在编写应用程序初始化逻辑时要注意这一点.
我想知道在通过HttpApplication.Error事件处理错误后,ASP.NET请求生命周期的哪些部分发生.具体来说,在出现错误后,在http://msdn.microsoft.com/en-us/library/bb470252.aspx#Stages中列出的哪些事件会触发?我知道EndRequest仍然会触发,我怀疑PreSendRequestHeaders和PreSendRequestContent也是如此,但除此之外我不知道.
它取决于生命周期中何时发生错误?是否依赖于我是否在错误处理程序中调用Server.ClearError()?
我问这个问题是因为我不知道是否应该从我的错误处理程序中调用HttpApplication.CompleteRequest().
我有一个aspx页面,我允许用户上传文件,我想将最大文件上传大小限制为10MB.IIS7,.NET 3.5.我在web.config文件中配置了以下内容:
<location path="foo.aspx">
<system.web>
<!-- maxRequestLength: kbytes, executionTimeout:seconds -->
<httpRuntime maxRequestLength="10240" executionTimeout="120" />
<authorization>
<allow roles="customRole"/>
<!-- Deny everyone else -->
<deny users="*"/>
</authorization>
</system.web>
<system.webServer>
<security>
<requestFiltering>
<!-- maxAllowedContentLength: bytes -->
<requestLimits maxAllowedContentLength="10240000"/>
</requestFiltering>
</security>
<handlers accessPolicy="Read, Script">
<add name="foo" path="foo.aspx" verb="POST"
type="System.Web.UI.PageHandlerFactory"
preCondition="integratedMode" />
</handlers>
</system.webServer>
</location>
Run Code Online (Sandbox Code Playgroud)
我有一个实现的自定义错误处理模块IHttpModule
.我发现当maxRequestLength
超过时,HttpApplication.Error
确实会被提升.但是当我玩游戏时maxAllowedContentLength
,HttpApplication.Error
事件没有被引发,用户被重定向到404.13页面.我已经附加了Visual Studio,第一次机会异常打开,没有任何东西被抛出.
我的第一个想法是检查早期事件中的标题内容长度 - 是否有建议/最佳实践我在哪里这样做?PostLogRequest?EndRequest?
我刚刚安装了Microsoft的.NET 4.5参考源,因为我正在尝试调试我正在看到的问题,我偶然发现了以下内容HttpApplication.cs
.
// execution step -- call asynchronous event
internal class AsyncEventExecutionStep : IExecutionStep {
private HttpApplication _application;
private BeginEventHandler _beginHandler;
private EndEventHandler _endHandler;
private Object _state;
private AsyncCallback _completionCallback;
private AsyncStepCompletionInfo _asyncStepCompletionInfo; // per call
private bool _[....]; // per call
private string _targetTypeStr;
Run Code Online (Sandbox Code Playgroud)
注意倒数第二行private bool _[....]; // per call
.
是_[....]
一个有效的标识符(在任何编译级别,包括IL)或者自编译以来是否已更改源?
我有一个派生自HttpApplication的类,它增加了一些额外的功能.我需要对这些功能进行单元测试,这意味着我必须能够创建HttpApplication的新实例,伪造请求并检索响应对象.
我究竟如何对HttpApplication对象进行单元测试?我现在正在使用Moq,但我不知道如何设置所需的模拟对象.
我遇到了一个特别有趣的情况.我有一个通用的错误处理例程当前工作.最近我注意到了一个有点奇怪的行为:HttpApplication.Error
会启动,但HttpContext.Current
会为空.这是我的HttpModule上的相关内容:
public void Init(HttpApplication context)
{
context.Error += context_Error;
context.PostMapRequestHandler += context_PostMapRequestHandler;
}
void context_PostMapRequestHandler(object sender, EventArgs e)
{
var aux = HttpContext.Current.Handler as Page;
if (aux != null) aux.Error += context_Error;
}
void context_Error(object sender, EventArgs e)
{
_localLog.Add("HttpApplication error handler reached.");
try
{
if (HttpContext.Current == null)
{
_localLog.Add("No HttpContext.");
}
else
{
var objError = HttpContext.Current.Server.GetLastError();
if (objError == null)
{
_localLog.Add("GetLastError(): no error.");
return;
}
//[Proper error handler follows here...]
}
} …
Run Code Online (Sandbox Code Playgroud) 自从我几年前开始编写经典的ASP 12(左右)以来,我已经完成了这一切,我从来没有找到一个很好的解决方案,因为ASP和ASP.NET的架构一直是不良做法的沼泽,魔术共享单身,等我最大的问题是用HttpApplication
其非事件的事件(对象Application_Start
,Application_End
等等).
如果你想在HTTP应用程序的整个生命周期内做一次Application_Start
事情,那么这是显而易见的.对?不完全是.首先,这本身不是一个事件,它是一个神奇的命名约定,如果遵循这个约定,会导致该方法在IIS创建的每个AppDomain上调用一次.
除了魔术命名惯例是一种可怕的做法,我开始认为这可能是Start
在HttpApplication
对象上不存在事件的原因.所以我已经尝试过确实存在的事件,例如Init
.嗯,这也不是一个真正的事件,它是一个可以覆盖的方法,这是下一个最好的事情.
似乎该Init()
方法是针对HttpApplication
对象的每个实例化调用的,每个AppDomain发生的次数不止一次.这意味着我不妨将我的启动逻辑放在HttpApplication
对象的构造函数中.
现在我的问题是,为什么我不应该将我的启动逻辑放在构造函数中?为什么甚至Init()
存在,我需要关心什么Application_Start
?如果我这样做,任何人都可以解释为什么HttpApplication
对象中的这个伪事件没有适当的事件或可覆盖的方法?
任何人都可以向我解释为什么在一个典型的ASP.NET应用程序中,我HttpApplication
创建了8个实例(这会导致构造函数Init
运行多次,当然;这可以通过锁定和调用的共享静态布尔值来缓解initialized
)当我的应用程序只有一个AppDomain?
Application_Start和Application_End方法是不代表HttpApplication事件的特殊方法.ASP.NET在应用程序域的生命周期内调用它们一次,而不是为每个HttpApplication实例调用它们.
我确信Application_Start与HttpApplication有关,在这里这个人解释了为什么我错了.哪个对象/实体与Application_Start事件有关?
asp.net application-start httpapplication application-lifecycle
httpapplication ×10
asp.net ×9
c# ×4
httpmodule ×2
lifecycle ×2
.net-4.5 ×1
app-startup ×1
iis-7 ×1
moq ×1
unit-testing ×1
web-config ×1