2011-02-04 4 views
7

WCF에서 간단한 REST API를 작성했으며 인증 메커니즘이 API 키를 사용합니다. 클라이언트가 요청 헤더에 API 키를 제출하면, 내가 (RequestInterceptor 클래스의이 ProcessRequest() 메소드를 오버라이드 (override) BaseService 클래스에서) 서버 측에서 그것을 검사로는 다음과 같습니다WCF의 HttpContext

public partial class BaseService : RequestInterceptor 
{ 
    public BaseService() : base(false) { } 

    #region Process Request 
    public override void ProcessRequest(ref RequestContext requestContext) 
    { 
     if (IsValidApiKey(requestContext)) 
      //put some values in HttpContext object. 

    } 

을 ...

이제 REST 서비스에서 aspnet 호환성을 활성화했지만 위의 ProcessRequest 재정의에서 HttpContext 객체에 액세스 할 수 없습니다. HttpContext는 서비스 메서드에서는 액세스 할 수 있지만 ProcessRequest 메서드에서는 액세스 할 수 없습니다.

왜 그런가?

답변

1

나는 다음과 같은 코드를 추가하여 내 문제를 해결 한 :

private HttpContext _httpContext; 
public BaseService() 
     : base(true) 
    { 
     _httpContext = HttpContext.Current;    

    } 

이 일 후에 내가 processRequest 메소드에 객체를 HttpContext에 액세스 할 수있게되었습니다.

1

HttpContext는 WCF 채널 스택에서 훨씬 나중에 초기화됩니다. 채널 인터셉터는 다른 것보다 먼저 채널 스택에서 실행되고 Http 채널 수신기에서 메시지를 수신 한 직후에 실행된다는 점을 기억하십시오. 요청 인터셉터에서 HttpContext에 액세스하려면 무엇이 필요합니까? HTTP 요청은 requestContext와 연관된 메시지의 등록 정보로 사용 가능합니다. 또한 메시지에 사용 가능한 속성 봉지에 일부 값을 저장할 수도 있습니다.

감사합니다. 파블로.

1

그러나 HttpContext.Current는 스레드로부터 안전하지 않으며 하나의 스레드로 설정된 내용은 다른 스레드에 의해 수정 될 수 있습니다.

예를 들어 두 건의 요청이 있습니다. 첫 번째 요청에 대해 RequestInterceptor의 HttpContext에 값을 입력합니다. 두 번째 요청은 첫 번째 요청이 RequestInterceptors로 끝나지 않을 때까지 대기합니다. 첫 번째 요청이 RequestInterceptors로 끝나고 서비스로 전달되면 두 번째 요청은 RequestInterceptors를 입력하고 첫 번째 요청이 완료되지 않은 경우 첫 번째 요청으로 설정된 HttpContext에 액세스 할 수 있습니다. 내가 만난 일종의 문제입니다.