Подтвердить что ты не робот

Передача контекста логического вызова из конвейера 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 делает вызовы контроллеров в отдельном контексте вызова.

Итак,

  • Почему (и как) ASP.NET изолирует контекст вызова от конвейера OWIN до контроллера WebApi?

  • Как передать контекстные данные из Pipeline в контроллер?

4b9b3361

Ответ 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>();
    }

Надеюсь, что это поможет!