2010-07-12 2 views
2

모든 ASMX 웹 서비스 클래스가 상속하는 공통 기본 클래스가 있습니다. 생성자에서 몇 가지 공통 인증 검사를 수행하려고합니다. 그들이 실패하면 즉시 처리를 중단하고 (하위 클래스의 코드가 실행되지 않음) 호출자에게 401 상태 코드 응답을 반환합니다.생성자의 논리를 기반으로 ASMX 요청을 중단하는 방법은 무엇입니까?

그러나,이 일의 일반 ASPX와 같은 방식으로 작동하지 않는 것 :

  1. Context.Response.End를(); 500 상태 코드 응답 내에서 ThreadAborted 예외를 호출자에게 항상 보냅니다. End()를 호출하기 전에 명시 적으로 Context.Response.StatusCode = 401을 설정하더라도 무시됩니다. 결과는 여전히 500 응답이며 메시지는 항상 "thread-aborted-exception"입니다.
  2. MSDN 나는 HttpContext.Current.ApplicationInstance.CompleteRequest()를 대신 사용합니다. 그러나 이것은 다운 스트림 처리를 멈추지 않습니다 : 내 하위 클래스의 함수는 생성자가 아무 것도하지 않은 것처럼 계속 실행됩니다. (생성자에서 권한을 검사하는 목적을 상실한 경우)
  3. 새 HttpException을 throw 할 수 있습니다. 이것은 다운 스트림 처리를 방지한다는 점에서 조금 더 좋으며 최소한 호출자에게 반환 된 예외 메시지를 제어 할 수 있습니다. 그러나 응답이 여전히 항상 500이라는 점에서 완벽하지는 않습니다.
  4. DoProcessing 인스턴스 var를 정의하고 생성자 내에서 true/false로 설정할 수 있습니다. 그런 다음 모든 단일 하위 클래스의 모든 단일 WebMethod에서 해당 기능을 if (DoProcessing) 블록 내에 포함 시키십시오.

이런 종류의 기능을 구현하는 데 더 나은 방법이 있습니까? 그렇다면 모든 ASMX 클래스에 공통적입니까?

편집 : John의 답변을 수락하는 것이 가장 좋은 방법 일 수 있습니다. 그러나 클라이언트가 추가 제 3 자 코드를 채택하는 것을 꺼려하고 AOP로 어느 정도의 FUD가 있었기 때문에 이러한 접근 방식을 사용하지 않았습니다. 위와 같은 옵션 # 3은 구현 속도와 유연성 사이에서 최상의 균형을 유지하면서 요구 사항을 충족시키는 것처럼 보였습니다.

답변

0

그런 시나리오를 명시 적으로 지원하는 WCF로 전환하는 것이 가장 좋은 방법입니다.

여전히 ASMX를 사용해야하는 경우 각 웹 메소드에서 기본 클래스 메소드를 호출하는 것이 가장 좋습니다. PostSharp와 같은 것을 사용하여 "마술처럼"모든 웹 메소드가 기본 클래스 메소드를 호출하도록 할 수 있습니다.

+0

다른 시스템에서 호스팅되기 때문에이 시스템에 대해 WCF를 결정 했으므로이 시스템에 대한 모든 호출은 XSS 제한을받습니다. JSONP는 그 문제를 해결하지만 자체 제한 집합 (GET 모드 전용, 원래 asp.net 서버에서 쿠키 전파 등)이 제공됩니다. WCF 액세스는 보안이 필요했기 때문에 JSONP 쿠키 제한을 해결하고 WCF 서비스와 asp.net 서비스간에 단일 사인온 (sign-on) 메커니즘을 구축해야했습니다. 모두 극복 할 수없는 것은 아니지만 ASMX는보다 실용적인 접근 방식 인 것으로 보입니다. – mikemanne

+0

@mike : 다른 시스템에서 WCF 서비스를 호스팅하는 이유는 무엇입니까? ASMX 서비스를 넣은 곳과 똑같은 장소에 놓고 똑같은 방식으로 실행하는 것이 어떻습니까? –

0
Context.Response.Write("My custom response message from constructor"); 
Context.Response.StatusCode = (int)HttpStatusCode.Forbidden;  
Context.Response.End(); 

그 코드는 생성자 다음에 웹 메서드에서 전달하지 못하게합니다.

관련 문제