2008-11-10 5 views
5

요청을 삭제/버리는 방법을 알아 내려고 노력하고 있습니다. 기본적으로 스팸 발송자를 차단하기 위해 앱에 차단 된 IP 목록을 구현하려고하는데 응답을 반환하지 않으려합니다 (요청을 무시하십시오).), ASP.NET에서 가능합니까?ASP.NET에서 요청을 삭제/삭제하는 방법은 무엇입니까?

편집 : 일부 답변에서는 방화벽에 추가 할 수 있다고 제안했지만 필자의 경우에는 적합하지 않습니다. 긴 이야기를 짧게하기 위해, 나는 중재자가 스팸에 대한 중재를 기다리고있는 (스팸 메일러로 필터링 된) 게시물을 확인하는 중재 섹션을 내 웹 사이트에 추가합니다. 일부 게시물의 보낸 사람의 IP를 차단 된 IP 목록 게시자가 사회자에 의해 스팸으로 표시되면 애플리케이션에서이를 수행 할 수 있습니다.

편집 : Response.End()를 호출하면 사용자에게 응답을 보냅니다 (비어 있음에도 불구하고). 내 질문의 전체 목적은 응답을 반환하지 않는 방법이었습니다. 호기심이 없어도 가능합니까? Response.Close()도 소켓을 닫지 만 통지를 보내면 (TCP/IP로), 수신 할 수 없다면 (즉, 사용자에게 아무 것도 보내지 않는 것처럼) 무시할 것입니다.

답변

3

어쩌면 당신은 요한이 제안이 있었는지

Response.Clear(); 
Response.End(); 
+1

주셔서 감사합니다 대답을 당신에게 시간을 절약 할 수 있지만, 실제로는 응답을 반환합니다, 난 그냥 요청을 무시하기 위해 노력하고있어. –

2

내 첫번째 생각을 사용할 수 있습니다. 가장 이상적인 솔루션은 방화벽에 액세스 할 수있는 경우 해당 IP를 방화벽의 차단 된 IP 목록에 추가하는 것입니다. 그러면 응용 프로그램에서 처리를 전혀 할 필요가 없습니다.

+0

이것은 내가 생각한 첫 번째 문제이지만 질문은 "내 앱에서"라고 말했습니다. –

2

편집 : 이것은 처리기 대신 HTTPModule로 구현하는 것이 더 나을지 모르지만 기본적인 생각은 사실입니다. 당신은 필요가 없습니다 그 방법은 응용 프로그램 코드에서이 검사에 대해 걱정할 필요, 당신은 아마 HttpHandler를를 사용하여이 작업을 수행 할 수 있습니다 자세한 내용


에 대한 http://www.kowitz.net/archive/2006/03/08/ihttpmodule-vs-ihttphandler.aspx을 참조하십시오 - 그것의 응용 프로그램이도 실행되기 전에 처리.

Psudo 코드는 - 당신이 바로 상태 코드 및 상태를 참조하여 두 줄을 제거, HTTP 200 (OK) 및 빈 페이지를 반환 할 경우, 분명히

class IgnoreHandler : IHttpHandler 
{ 
    #region IHttpHandler Members 

    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Clear(); 
     context.Response.StatusCode = 401; 
     context.Response.Status = "Unauthorized"; 
     context.Response.End(); 
    } 

    #endregion 
} 

을 테스트하지.

그리고는 핸들러 또는 페이지와 함께이 일을 반대로 내가 HTTP Module으로 갈 것, 일의이 유형의 Web.config의

<httpHandlers> 
    <add verb="*" 
     path="*" 
     validate="false" 
     type="MyNamespace.IgnoreHandler, MyAssembly" /> 
</httpHandlers> 
4

에 등록.

왜 핸들러 대신 모듈을 사용합니까? HTTP 모듈은 요청 파이프 라인에서 일찍 호출됩니다. 이러한 유형의 블랙리스트에 올린 요청에 대해서는 가능한 한 빨리 그리고 빨리 요청을 삭제하고 싶습니다. 즉, 요청이 빠르면 요청을 삭제할 수 있습니다.

모듈 대 핸들러 here에 대해 좀 더 자세히 읽을 수 있습니다.

+0

Heh. 내 게시물을 수정하십시오. 내 의견을 추가 한 후 귀하의 답변을 읽었습니다. –

0

"최선의 해결책은 특정"응답 없음 "을주지 말고 더 많은 표준 http 오류 메시지를 줄이는 것입니다.

throw new HttpException(404, "File not found - " + Request.AppRelativeCurrentExecutionFilePath);

나는이 포기하고 멀리 가서 다른 쪽 끝에서 사람을 설득 매우 효과적이라고 생각 : 나는 권한이없는 사용자를 억제하려고 시도하고 때마다 나는 다음과 같은 메시지를 찾을 수없는 페이지/URL을 실행합니다.

0

다른 성가신하지만 쉬운 방법은 잠자기 시간을 줄이기 위해 잠을 청하는 것입니다.

+0

요청을 잠자 게하면 더 많은 CPU와 리소스를 사용하여 올바른 요청을 서버에서 오래 유지할 수 있습니다. 나는 자고있는 것보다 더 죽일 것이라고 생각합니다. – Austin

0

AFAIK 응답없이 요청을 철저히 삭제할 수는 없습니다. 원하는 스레드 수면 기법을 사용하여 ASP.NET에서 요청을 계속 유지할 수 있지만 그런 식으로 서버의 수명을 늘리지는 못합니다.

당신이 원하는 것을 얻기 위해 내가 아는 가장 좋은 방법은 웹 서버에 도달하기 전에 ZXTM과 같은 트래픽 관리자를 요청하는 것입니다. 여기

0

당신은 이동 :

public class RequestDropper : IHttpModule 
{ 
    public void Dispose() 
    { 
     throw new NotImplementedException(); 
    } 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += Context_BeginRequest; 
    } 

    public void Context_BeginRequest(object sender, EventArgs e) 
    { 
     var request = ((HttpApplication)sender).Context.Request; 

     if (todayIAmNotInAMoodToProcessRequests) 
     { 
      request.Abort(); 
     } 
    } 
} 

희망이

관련 문제