2015-03-22 19 views
17

Tôi đang cố gắng chuyển thông tin ngữ cảnh về ngữ cảnh cuộc gọi logic (sử dụng CallContext.LogicalSetData(CallContextKey, value)) theo bài đăng của Stephen Cleary http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html; và lấy cảm hứng từ mã số trong https://github.com/neuecc/OwinRequestScopeContext.Chuyển ngữ cảnh cuộc gọi logic từ đường ống OWIN tới bộ điều khiển WebApi

Giá trị sẽ có sẵn thông qua đường ống OWIN, nhưng không có sẵn khi cuộc gọi vào bộ điều khiển WebApi, giá trị không được đặt.

Tôi cũng nhận thấy rằng khi đặt điểm ngắt trong bộ điều khiển, tôi không thể thấy đường ống OWIN trong ngăn xếp cuộc gọi. Rõ ràng, ASP.NET đang thực hiện các cuộc gọi điều khiển trên một ngữ cảnh cuộc gọi riêng biệt.

Vì vậy,

  • Tại sao (và làm thế nào) không ASP.NET cô lập bối cảnh cuộc gọi từ đường ống OWIN với bộ điều khiển WebAPI?

  • Làm cách nào để chuyển dữ liệu theo ngữ cảnh từ đường ống đến bộ điều khiển?

Trả lời

7

Tôi đã mất nhiều ngày để tìm hiểu lý do tại sao CallContext là rõ ràng trong bộ điều khiển API, cho đến khi tôi đọc bài viết này: http://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline

Nếu hai middleware chạy trong giai đoạn IIS khác nhau, họ sẽ có CallContext khác nhau.

Nếu bạn đang lưu trữ OWIN trên IIS và muốn cùng một ngữ cảnh yêu cầu trong tất cả các phần mềm trung gian, hãy sử dụng tên cũ HttpContext.Current thay thế.

0

Tôi không thực sự chắc chắn những gì bạn có nghĩa là bằng cách truyền dữ liệu theo ngữ cảnh từ đường ống với bộ điều khiển nhưng có lẽ nếu bạn đã sử dụng Microsoft.AspNet.Identity, bạn có thể tận dụng việc sử dụng IAppBuilder.CreatePerOwinContext để đăng ký đối tượng của bạn vào đường ống.

tôi sử dụng để làm một cái gì đó như thế khi tôi muốn vượt qua đối tượng theo ngữ cảnh của tôi thông qua Owin đường ống để điều khiển WebAPI:

startup.cs

//Registration of a delegate factory 
app.CreatePerOwinContext<Foo>(Factory.CreateFoo); 

factory.cs

//Contextual Object 
public static Foo CreateFoo(IdentityFactoryOptions<Foo> options, IOwinContext context) 
    { 
     //Owin Context is available here 
    } 

controller.cs

public FooController() 
    { 
     var fooObj= HttpContext.Current.GetOwinContext().Get<Foo>(); 
    } 

Hy vọng điều đó sẽ hữu ích!

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