2014-12-08 15 views
10

Tôi cần một cách để lưu trữ đối tượng ghi nhật ký cho mỗi yêu cầu. Với HttpContext tôi sẽ thêm nó vào mục Dictionary. Tôi không muốn đưa HttpContext vào đây nếu tôi có thể giúp. Đoạn mã dưới đây là những gì tôi đề xuất cho Unity LifeTimeManager sẽ lưu trữ các đối tượng trong thuộc tính Môi trường của OwinContext, mà tôi có quyền truy cập vào với phần mềm trung gian Owin của tôi.Tôi có nên sử dụng Môi trường của OwinContext để lưu dữ liệu ứng dụng cụ thể theo yêu cầu

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; 
    } 
} 

Sau đó, tôi có thể sử dụng nó như thế này từ middleware của tôi:

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

Nó xảy ra với tôi rằng tôi có thể chọn bất cứ điều gì quan trọng tôi muốn ngoại trừ những người đã được bảo vệ bởi Owin. Có lý do nào tôi không nên sử dụng OwinContext.Environment cho mục đích này không? Các tài liệu MSDN là mơ hồ về các thực hành tốt nhất này.

Phản hồi của Darrel Miller tại đây: How should I store per request data when using OWIN to Self-Host ASP.NET Web API dẫn tôi tin rằng bộ sưu tập thuộc tính trên đối tượng yêu cầu là cách để đi. Làm cách nào để truy cập đối tượng này từ phần mềm trung gian?

+0

Tôi đã chỉnh sửa tiêu đề của bạn. Vui lòng xem, "[Câu hỏi có nên bao gồm" thẻ "trong tiêu đề của họ không?] (Http://meta.stackexchange.com/questions/19190/)", trong đó sự đồng thuận là "không, họ không nên". –

+1

Tôi biết đây là một câu hỏi cũ, nhưng tôi chỉ muốn lưu ý nơi bạn tạo ra chìa khóa của bạn 'new Guid()' nên là 'Guid.NewGuid()'. 'new Guid()' tạo ra một guid rỗng (tất cả các số không - 'Guid.Empty') mỗi lần. –

+0

Điều cần biết. Hóa ra vì nó lưu nó trong bối cảnh yêu cầu, tôi chỉ sử dụng một hằng số thay vì lưu một ID. – codetoast

Trả lời

11

Từ điển môi trường OWIN có thể được sử dụng để lưu trữ dữ liệu theo yêu cầu. Bộ sưu tập thuộc tính của đối tượng yêu cầu có thể được sử dụng để thực hiện tương tự.

Sự khác biệt chính là từ điển môi trường OWIN là một khái niệm OWIN và có thể áp dụng cho bất kỳ phần mềm trung gian nào đang chạy trong một máy chủ OWIN. Bộ sưu tập thuộc tính của đối tượng yêu cầu là một khái niệm ASP.NET Web API và chỉ áp dụng cho khung công tác cụ thể đó.

BTW, ASP.NET Web API tự chạy dưới dạng phần mềm trung gian trong đường ống OWIN. Vì vậy, để trả lời câu hỏi của bạn, bạn không thể truy cập bộ sưu tập thuộc tính yêu cầu của API Web từ phần mềm trung gian của bạn vì nó chỉ áp dụng cho phần mềm trung gian Web API (hoặc khung công tác cụ thể).

Nếu bạn muốn viết công cụ quan tâm chéo của bạn làm phần mềm trung gian OWIN, bạn phải sử dụng từ điển môi trường OWIN. Nếu các điểm mở rộng API Web giống như một bộ lọc hoặc trình xử lý tin nhắn không sao thì bạn có thể sử dụng bộ sưu tập thuộc tính. Rõ ràng, bất cứ điều gì bạn viết tận dụng các điểm mở rộng API Web chỉ áp dụng cho Web API trong khi phần mềm trung gian OWIN được áp dụng cho bất kỳ loại ứng dụng nào đang chạy trong đường ống OWIN và bao gồm API Web.

+1

Câu trả lời này http://stackoverflow.com/a/28242568/879655 như thế nào? – Calvin

+2

Nhiều văn bản, ít ý nghĩa. Thêm đối số: Đồng thời? HttpContext.Current.Items vs Owin môi trường khác biệt? Owin FILO và tầm quan trọng của việc đăng ký phần mềm trung gian .. Muốn nghe nhiều hơn về những thứ cụ thể hơn là "sử dụng API Web" => Chúng ta cũng nên dùng .. –

Các vấn đề liên quan