【问题标题】:System.Web.HttpException with BasicAuthentication custom HttpModuleSystem.Web.HttpException 与 BasicAuthentication 自定义 HttpModule
【发布时间】:2011-12-12 05:00:44
【问题描述】:

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

BasicAuthentication HttpModule 正在订阅管道中的两个事件,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"];有关

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

【问题讨论】:

    标签: c# .net exception httpmodule httpexception


    【解决方案1】:

    看起来该错误是由服务器变量AUTH_USER被更改引起的,这在iis7及更高版本的集成管道中是不允许的。

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

    此链接提供详细信息。

    它表示可以在托管模块中处理身份验证通知。但是我仍然不知道如何实现这一点。但我将就该主题提出一个新问题,因为这个问题变得相当冗长并且已得到有效解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 2013-12-13
      • 2010-11-27
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多