IIS7의 404 + HttpHandler에 양식 게시:모든 POST 데이터가 사라진 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/102846

  •  01-07-2019
  •  | 
  •  

문제

좋아요, 조금 혼란스럽고 복잡하게 들릴 수도 있으니 양해해 주세요.

우리는 친숙한 URL을 정의할 수 있는 프레임워크를 작성했습니다.임의의 URL로 서핑하는 경우 IIS는 404 오류(또는 경우에 따라 403,14 또는 405)를 표시하려고 시도합니다.그러나 IIS는 특정 오류와 관련된 모든 내용이 .aspx 파일로 전송되도록 설정되어 있습니다.이를 통해 우리는 요청을 처리하고 관련 템플릿을 찾은 다음 이와 관련된 모든 것을 실행하는 작업을 수행하는 HttpHandler를 구현할 수 있습니다.

이제 이 모든 기능은 IIS 5 및 6에서 작동하며 어느 정도 IIS7에서도 작동합니다. 그러나 한 가지 문제는 양식을 게시할 때 발생합니다.

존재하지 않는 URL에 양식을 게시하면 IIS에서 "아, 하지만 해당 URL은 존재하지 않습니다."라고 말하고 405 "메서드가 허용되지 않습니다." 오류가 발생합니다.IIS에 해당 오류를 .aspx 페이지로 리디렉션하고 HttpHandler를 사용하여 처리하도록 지시하므로 이는 일반적으로 문제가 되지 않습니다.그러나 IIS7부터는 405로 리디렉션된 후 모든 POST 정보가 누락되었습니다.따라서 더 이상 양식과 관련된 가장 사소한 작업을 수행할 수 없습니다.

이 문제를 해결하기 위해 우리는 POST 데이터를 보존하지만 적절한 시간(필요할 때)에 초기화된 세션이 없는 것처럼 보이는 HttpModule을 사용해 보았습니다.우리는 또한 404/403;14/405에 도달한 누락된 요청뿐만 아니라 모든 요청에 ​​대해 HttpModule을 사용해 보았습니다. 이는 이미지, CSS, js 등과 같은 항목이 .NET 코드에 의해 처리되고 있다는 것을 의미하며 이는 매우 비효율적입니다.

실제 질문이 생깁니다.누구든지 이런 일을 겪은 적이 있습니까? 조언이 있거나 일을 다시 시작하기 위해 무엇을 해야할지 아는 사람이 있습니까?지금까지 누군가가 Microsoft 자체 제품을 사용하도록 제안했습니다. URL 재작성 모듈.이것이 우리 문제를 해결하는 데 도움이 될까요?

감사해요.

도움이 되었습니까?

해결책

Microsoft는 이에 대한 핫픽스를 출시했습니다.

http://support.microsoft.com/default.aspx/kb/956578

다른 팁

IIS7은 위에서 아래로 .net을 사용하므로 HttpModule을 사용하는 데 따른 성능 오버헤드가 없습니다. 실제로 모든 요청에 ​​항상 사용되는 여러 관리형 HttpModule이 있습니다.BeginRequest 이벤트가 발생하면 SessionStateModule이 Modules 컬렉션에 추가되지 않았을 수 있으므로 이 이벤트 중에 요청을 처리하려고 하면 세션 상태 정보를 사용할 수 없습니다.HttpContext.Handler 속성을 설정하면 요청된 핸들러에 필요한 경우 세션 상태가 초기화되므로 IRequiresSessionState를 구현하는 멋진 404 페이지로 핸들러를 설정할 수 있습니다.아래 코드는 트릭을 수행해야 하지만 IsMissing() 메서드에 대해 다른 구현을 작성해야 할 수도 있습니다.

using System.Web;
using System.Web.UI;

class Smart404Module : IHttpModule
{
    public void Dispose() {}

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new System.EventHandler(DoMapping);
    }

    void DoMapping(object sender, System.EventArgs e)
    {
        HttpApplication app = (HttpApplication)sender;

        if (IsMissing(app.Context))
            app.Context.Handler = PageParser.GetCompiledPageInstance(
                "~/404.aspx", app.Request.MapPath("~/404.aspx"), app.Context);
    }

    bool IsMissing(HttpContext context)
    {
        string path = context.Request.MapPath(context.Request.Url.AbsolutePath);

        if (System.IO.File.Exists(path) || (System.IO.Directory.Exists(path)
            && System.IO.File.Exists(System.IO.Path.Combine(path, "default.aspx"))))
            return true;
        return false;
    }
}

편집하다:IsMissing() 구현을 추가했습니다.

메모:IIS7에서는 세션 상태 모듈이 기본적으로 전역적으로 실행되지 않습니다.두 가지 옵션이 있습니다:모든 요청에 ​​대해 세션 상태 모듈을 활성화하거나(모든 요청 유형에 대해 관리되는 모듈 실행에 대한 위의 설명 참조) 리플렉션을 사용하여 System.Web.dll 내의 내부 멤버에 액세스할 수 있습니다.

사용자 정의 오류 처리기로 전달되지 않는 사후 변수의 IIS 7 문제는 Vista용 서비스 팩 2에서 수정되었습니다.Windows Server에서는 시도하지 않았지만 Windows Server에서도 수정될 것이라고 확신합니다.

추측해 보세요:요청을 처리하는 IIS7의 %windir%\system32\inetsrv\config\applicationhost.config에 지정된 처리기가 POST 동사의 통과를 전혀 허용하지 않으며 URL이 존재하지 않는지 확인하기 전에 해당 규칙을 평가합니다. .

예, URL 재작성을 권장합니다(Microsoft의 IIS7 중 하나 또는 여러 대안 중 하나 사용).이것은 친숙한 URL을 제공하기 위해 특별히 설계된 반면, 오류 문서는 실패에 대한 최후의 방어책으로, 들어오는 데이터가 예상과 다를 수 있도록 방해하는 경향이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top