我正在尝试调试我不断获得的System.Web.HttpException。它可能与我试图实现的BaiscAuthentication自定义HttpModule有关。
BasicAuthentication HttpModule正在订阅管道中的两个事件,BeginRequest和AuthenticateRequest。
订阅BeginRequest事件的所有代码都成功执行。但是在执行订阅AuthenticateRequest的代码之前,我得到了一个System.Web.HttpException。
Exeception如下
Exception Details: System.Web.HttpException: This server variable cannot be modified during request execution.
并且堆栈跟踪如下
[HttpException (0x80004005): This server variable cannot be modified during request execution.]
System.Web.HttpServerVarsCollection.SetServerVariableManagedOnly(String name, String value) +2423129
System.Web.HttpServerVarsCollection.SynchronizeServerVariable(String name, String value) +28
System.Web.HttpRequest.SynchronizeServerVariable(String name, String value) +112
System.Web.Hosting.IIS7WorkerRequest.GetServerVarChanges(HttpContext ctx) +372
System.Web.Hosting.IIS7WorkerRequest.SynchronizeVariables(HttpContext context) +8743312
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +154
代码在我的本地计算机上运行良好,但在我的主机服务器上运行不正确。
更新
我找到了有问题的代码,但没有弄清楚如何解决这个问题。这是基本代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
namespace CustomHttpModule
{
public class CustomModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
}
public void context_BeginRequest(Object sender, EventArgs e)
{
HttpApplication context = (HttpApplication)sender;
string authHeader = context.Context.Request.Headers["Authorization"];
if (String.IsNullOrEmpty(authHeader))
{
SendAuthHeader(context);
}
context.Context.Response.Clear();
context.Context.Response.Write("Have reached the end of BeginRequest");
//context.Context.Response.End();
}
private void SendAuthHeader(HttpApplication context)
{
context.Response.Clear();
context.Response.StatusCode = 401;
context.Response.StatusDescription = "Authorization Request";
context.Response.AddHeader("WWW-Authenticate", "Basic realm=\"Secure Area\"");
context.Response.Write("401 baby, please authenticate");
context.Response.End();
}
public void context_AuthenticateRequest(Object sender, EventArgs e)
{
HttpApplication context = (HttpApplication)sender;
context.Context.Response.Clear();
context.Context.Response.Write("Have reached the Beginning of AuthenticateRequest");
context.Context.Response.End();
}
public void Dispose()
{
}
}
}
此代码产生错误。但是如果你换线......
string authHeader = context.Context.Request.Headers["Authorization"];
到
string authHeader = context.Context.Request.Headers["Host"];
然后代码也执行得很好。
似乎正在访问导致该错误的Headers["Authorization"];
。
但是,如果您离开Headers["Authorization"];
并取消注释第//context.Context.Response.End();
行,那么代码也可以正常执行。
错误似乎发生在BeginRequest结束和AuthenticateRequest的开始之间。但似乎与代码Headers["Authorization"];
我不知道为什么会这样。我想知道它是否只是服务器的一个错误,因为代码在我的本地机器上运行良好。
答案 0 :(得分:3)
看起来好像是由于服务器变量AUTH_USER
被更改而导致的错误,iis7及更高版本中的集成管道不允许这样做。
http://support.microsoft.com/kb/2605401/en-us?sd=rss&spid=14855
此链接提供详细信息。
它表示可以在托管模块中处理身份验证通知。但是我仍然不知道如何实现这一目标。但是我将就这个问题提出一个新问题,因为这个问题变得相当冗长并且得到了有效的解决。