Передача контекста логического вызова из конвейера OWIN в контроллер WebApi
Я пытаюсь передать контекстуальную информацию в контексте логического вызова (используя CallContext.LogicalSetData(CallContextKey, value)
) согласно сообщению Стивена Клири http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html; и вдохновлен кодом в https://github.com/neuecc/OwinRequestScopeContext.
Значение будет доступно через конвейер OWIN, но оно недоступно, если вызов входит в контроллер WebApi, значение не задано.
Я также заметил, что при установке контрольной точки в контроллере я не вижу конвейер OWIN в стеке вызовов. По-видимому, ASP.NET делает вызовы контроллеров в отдельном контексте вызова.
Итак,
Ответы
Ответ 1
Мне потребовалось несколько дней, чтобы узнать, почему CallContext ясен в контроллере API, пока я не прочитал эту статью:
http://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline
Если два промежуточного программного обеспечения работают на разных этапах IIS, у них будет другой CallContext.
Если вы размещаете OWIN в IIS и хотите иметь тот же контекст запроса во всех средах, используйте вместо этого старый HttpContext.Current
.
Ответ 2
Я не уверен, что вы подразумеваете, передавая контекстные данные из Pipeline в контроллер, но, возможно, если вы уже используете Microsoft.AspNet.Identity, вы можете использовать использование IAppBuilder.CreatePerOwinContext, чтобы зарегистрировать ваш объект в конвейере.
Я использую что-то подобное, когда хочу передать свой контекстный объект через Owin Pipeline для контроллеров 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>();
}
Надеюсь, что это поможет!