2011-10-20 6 views
2

계속 가져 오는 System.Web.HttpException을 디버깅하려고합니다. 구현하려고하는 BaiscAuthentication 사용자 정의 HttpModule과 관련 될 수 있습니다.BasicAuthentication 사용자 지정 HttpModule을 사용하는 System.Web.HttpException

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 

코드는 내 로컬 컴퓨터에 있지만 내 호스트 서버에서 잘 실행을 다음과 같이 스택 추적을 그대로

예외에있다.

내가 버그를 수정하는 방법을 알아 냈 잘못된 코드를 찾았지만하지 않은

UPDATE. 다음은 기본 코드입니다.

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

에 선 ..

string authHeader = context.Context.Request.Headers["Authorization"]; 

을 변경한다면 다음 코드는 잘 실행됩니다.

버그를 일으키는 것으로 보이는 Headers["Authorization"];에 액세스하는 것처럼 보입니다.

그러나 Headers["Authorization"];을 그대로두고 //context.Context.Response.End(); 줄의 주석 처리를 제거하면 코드도 제대로 실행됩니다.

BeginRequest의 끝과 AuthenticateRequest의 시작 사이에 버그가있는 것 같습니다. 하지만 코드와 관련이있는 것 같습니다. Headers["Authorization"];

나는 이것이 왜 있어야하는지 잘 모릅니다. 내 로컬 컴퓨터에서 코드가 제대로 실행되는 것처럼 서버에 버그가 있는지 궁금합니다.

답변

3

iis7 이상의 통합 파이프 라인에서 허용되지 않는 서버 변수 AUTH_USER이 변경되어 버그가 발생한 것처럼 보입니다.

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

이 링크를 클릭하면 세부 정보를 제공합니다.

인증 알림은 관리되는 모듈 내에서 처리 될 수 있습니다. 그러나 나는 아직도 이것을 습득하는 방법을 모른다. 그러나 나는이 주제에 대해 새로운 질문을하기 위해 오랜 시간이 걸리고 효과적으로 해결 될 것입니다.