2014-12-08 2 views
10

요청 당 로깅 개체를 저장하는 방법이 필요합니다. HttpContext를 사용하여이 항목을 Dictionary에 추가합니다. 내가 도울 수 있다면 HttpContext를 가져 오는 것을 원하지 않는다. 아래 코드는 OwinContext의 Environment 속성에 객체를 저장하는 Unity LifeTimeManager에 대해 제안한 코드입니다. Owin 미들웨어에 액세스 할 수 있습니다.OwinContext의 환경을 사용하여 요청마다 응용 프로그램 별 데이터를 보유해야합니까?

public class OwinContextLifetimeManager : LifetimeManager 
{ 
    private string key = (new Guid()).ToString(); 
    private IDictionary<string, object> environment; 

    public OwinContextLifetimeManager(IDictionary<string, object> environment) 
    { 
     this.environment = environment; 
    } 

    public override object GetValue() 
    { 
     if (environment != null && environment.ContainsKey(key)) 
      return environment[key]; 
     else 
      return null; 
    } 

    public override void RemoveValue() 
    { 
     if (environment != null) 
      environment.Remove(key); 
    } 

    public override void SetValue(object newValue) 
    { 
     if (environment != null) 
      environment[key] = newValue; 
    } 
} 

그럼 난 내 미들웨어에서 다음과 같이 사용할 수 있습니다 :

container.RegisterType<IRequestLog, RequestLog>(new OwinContextLifetimeManager(environment)); 

내가 이미 Owin에 의해 예약 된 것을 제외하고 원하는 키를 선택할 수 있다는 것을 나에게 발생합니다. 이 목적으로 OwinContext.Environment를 사용하면 안되는 이유가 있습니까? MSDN 설명서는 모범 사례에 대해 모호합니다.

여기 Darrel Miller의 응답 : How should I store per request data when using OWIN to Self-Host ASP.NET Web API은 요청 개체의 속성 모음을 사용하는 것이 좋습니다. 미들웨어에서이 객체에 어떻게 액세스합니까?

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

+1

이것이 낡은 질문이지만,'new Guid()'가'Guid.NewGuid()'가 되어야만 열쇠를 생성하는 위치에 주목하고 싶습니다. 'new Guid()'는 매번 빈 guid (모두 0 -'Guid.Empty')를 만듭니다. –

+0

잘 알고 있습니다. 요청의 컨텍스트에서 저장하기 때문에 나중에 ID를 저장하는 대신 상수를 사용했습니다. – codetoast

답변

11

OWIN 환경 사전을 사용하여 요청 당 데이터를 저장할 수 있습니다. 요청 개체의 속성 모음을 사용하여 동일한 작업을 수행 할 수 있습니다.

OWIN 환경 사전은 OWIN 개념으로 OWIN 호스트에서 실행되는 모든 미들웨어에 적용 할 수 있습니다. 요청 개체의 속성 컬렉션은 ASP.NET 웹 API 개념이며 특정 프레임 워크에만 적용됩니다.

둘째, ASP.NET 웹 API 자체가 OWIN 파이프 라인의 미들웨어로 실행됩니다. 귀하의 질문에 대답하기 위해 Web API 미들웨어 (또는 특정 프레임 워크)에만 적용 할 수 있기 때문에 미들웨어에서 Web API의 요청 속성 모음에 액세스 할 수 없습니다.

OWIN 미들웨어로 크로스 커팅 문제를 작성하려면 OWIN 환경 사전을 사용해야합니다. 필터 나 메시지 처리기와 같은 웹 API 확장 점이 괜찮 으면 속성 모음을 사용할 수 있습니다.

OWIN 미들웨어는 OWIN 파이프 라인에서 실행되는 모든 종류의 응용 프로그램에 적용 가능하고 웹 API를 포함하는 반면 Web API 확장 점을 사용하는 것은 웹 API에만 적용 할 수 있습니다.

+1

어떻게이 대답은 http://stackoverflow.com/a/28242568/879655입니까? – Calvin

+2

많은 텍스트, 거의 의미가 없습니다. 추가 인수 : 동시성? HttpContext.Current.Items 대 Owin 환경의 차이점은 무엇입니까? Owin FILO와 미들웨어 등록의 중요성 .. "Web API uses"보다는 구체적인 것들에 대해 더 많이 듣고 싶다.> 우리도 사용해야한다. –

관련 문제