계속 가져 오는 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"];
나는 이것이 왜 있어야하는지 잘 모릅니다. 내 로컬 컴퓨터에서 코드가 제대로 실행되는 것처럼 서버에 버그가 있는지 궁금합니다.