요청 당 로깅 개체를 저장하는 방법이 필요합니다. 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은 요청 개체의 속성 모음을 사용하는 것이 좋습니다. 미들웨어에서이 객체에 어떻게 액세스합니까?
제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –
이것이 낡은 질문이지만,'new Guid()'가'Guid.NewGuid()'가 되어야만 열쇠를 생성하는 위치에 주목하고 싶습니다. 'new Guid()'는 매번 빈 guid (모두 0 -'Guid.Empty')를 만듭니다. –
잘 알고 있습니다. 요청의 컨텍스트에서 저장하기 때문에 나중에 ID를 저장하는 대신 상수를 사용했습니다. – codetoast