System.Web.HttpException with BasicAuthentication custom Htt

本文关键字:custom Htt BasicAuthentication with Web HttpException System | 更新日期: 2023-09-27 18:11:47

我正试图调试我不断得到的System.Web.HttpException。它可能与我正在尝试实现的BaiscAuthentication自定义HttpModule有关。

basicauthenticationhttpmodule正在订阅管道中的两个事件,BeginRequest和AuthenticateRequest。

订阅BeginRequest事件的所有代码执行成功。但是在订阅AuthenticateRequest的代码被执行之前,我得到一个System.Web.HttpException.

异常如下

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"];

有关

我不知道为什么会这样。我想知道它是否只是服务器的一个bug,因为代码在我的本地机器上运行良好。

System.Web.HttpException with BasicAuthentication custom Htt

看起来这个bug是由服务器变量AUTH_USER被更改引起的,这是iis7及以上版本的集成管道不允许的。

http://support.microsoft.com/kb/2605401/en-us?sd=rss& spid = 14855

此链接提供详细信息。

它说认证通知可以在托管模块中处理。然而,我仍然不知道如何实现这一点。但是我要就这个话题开一个新问题,因为这个问题已经很长了,而且已经有效地解决了。