2014-12-08 1 views
10

Мне нужен способ хранения объекта регистрации в запросе. С HttpContext я бы добавил это в словарь статей. Я не хочу приводить HttpContext в это, если могу помочь. Ниже приведен код, который я предлагаю для Unity LifeTimeManager, который будет хранить объекты в свойстве среды OwinContext, к которому у меня есть доступ с моим промежуточным программным обеспечением 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 заставляет меня полагать, что коллекция свойств на объекте запроса - путь. Как я могу получить доступ к этому объекту из промежуточного программного обеспечения?

+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+1

Я знаю, что это старый вопрос, но я хотел бы отметить, где вы создаете ключ 'new Guid()' должен быть 'Guid.NewGuid()'. 'new Guid()' каждый раз создает пустой guid (все нули - 'Guid.Empty'). –

+0

Полезно знать. Оказывается, поскольку он сохраняет его в контексте запроса, я просто использовал константу вместо сохранения идентификатора. – codetoast

ответ

11

Словарь среды OWIN может использоваться для хранения данных для запроса. Свойство свойств объекта запроса можно использовать для того, чтобы сделать то же самое.

Главное отличие - словарь среды OWIN является концепцией OWIN и применим к любому промежуточному программному обеспечению, запущенному на хосте OWIN. Свойство свойств объекта запроса представляет собой концепцию веб-API ASP.NET и применимо только к этой конкретной структуре.

BTW, ASP.NET Web API сам работает как промежуточное ПО в конвейере OWIN. Поэтому, чтобы ответить на ваш вопрос, вы не можете получить доступ к коллекции свойств запроса API веб-интерфейса из своего промежуточного программного обеспечения, поскольку оно применимо только к промежуточному программному средству Web API (или к конкретной инфраструктуре).

Если вы хотите написать свой кросс-концертный материал как промежуточное ПО OWIN, вы должны использовать словарь среды OWIN. Если веб-расширение API как фильтр или обработчик сообщений в порядке, то вы можете использовать коллекцию свойств.

Очевидно, что все, что вы пишете с использованием точек расширения веб-API, применимо только к веб-API, тогда как промежуточное ПО OWIN применимо к любому приложению, работающему в конвейере OWIN, и которое включает веб-API.

+1

Как этот ответ http://stackoverflow.com/a/28242568/879655? – Calvin

+2

Много текста, немного смысл. Дополнительные аргументы: параллелизм? HttpContext.Current.Items vs Owin Различия в среде? Owin FILO и важность регистрации посредников. Пожелайте узнать больше о конкретных вещах, а не о «использовании веб-API» => Мы также должны использовать. –

Смежные вопросы