Поделиться через


Открытый веб-интерфейс для .NET (OWIN) в ASP.NET Core

Авторы: Стив Смит (Steve Smith) и Рик Андерсон (Rick Anderson)

ASP.NET Core:

  • поддерживает открытый веб-интерфейс для .NET (OWIN);
  • Имеет совместимые замены для библиотек Microsoft.Owin.* (Katana).

OWIN позволяет ослабить зависимость веб-приложений от веб-сервера. Он определяет стандартный способ использования ПО промежуточного в конвейере для обработки запросов и связанных с ними откликов. Приложения ASP.NET Core и ПО промежуточного слоя могут взаимодействовать с приложениями, серверами и ПО промежуточного слоя, основанными на OWIN.

OWIN обеспечивает разделительный уровень, позволяющий совместно использовать две платформы с разнородными объектными моделями. Пакет Microsoft.AspNetCore.Owin содержит две реализации адаптера:

  • ASP.NET Core в OWIN
  • OWIN в ASP.NET Core

Это позволяет размещать ASP.NET Core поверх сервера или узла, совместимого с OWIN, а также запускать другие совместимые с OWIN компоненты поверх ASP.NET Core.

Note

Использование этих адаптеров сопряжено с потерями производительности. Приложениям, использующим только компоненты ASP.NET Core, не следует использовать адаптеры или пакет Microsoft.AspNetCore.Owin.

Просмотреть или скачать образец кода (описание загрузки)

Выполнение ПО промежуточного слоя OWIN в конвейере ASP.NET Core

Поддержка OWIN для ASP.NET Core развертывается в составе пакета Microsoft.AspNetCore.Owin. Вы можете импортировать поддержку OWIN в проект, установив этот пакет.

ПО промежуточного слоя OWIN соответствует спецификации OWIN, где требуется задать интерфейс Func<IDictionary<string, object>, Task> и определенные ключи (такие как owin.ResponseBody). Следующее простое ПО промежуточного слоя OWIN отображает сообщение "Hello World":

public Task OwinHello(IDictionary<string, object> environment)
{
    string responseText = "Hello World via OWIN";
    byte[] responseBytes = Encoding.UTF8.GetBytes(responseText);

    // OWIN Environment Keys: http://owin.org/spec/spec/owin-1.0.0.html
    var responseStream = (Stream)environment["owin.ResponseBody"];
    var responseHeaders = (IDictionary<string, string[]>)environment["owin.ResponseHeaders"];

    responseHeaders["Content-Length"] = new string[] { responseBytes.Length.ToString(CultureInfo.InvariantCulture) };
    responseHeaders["Content-Type"] = new string[] { "text/plain" };

    return responseStream.WriteAsync(responseBytes, 0, responseBytes.Length);
}

Сигнатура примера возвращает Task и принимает IDictionary<string, object>, как того требует OWIN.

Приведенный ниже код показывает, как добавить ПО промежуточного слоя OwinHello (показано выше) в конвейер ASP.NET Core с помощью метода расширения UseOwin.

public void Configure(IApplicationBuilder app)
{
    app.UseOwin(pipeline =>
    {
        pipeline(next => OwinHello);
    });
}

В конвейере OWIN можно настроить и другие действия.

Note

Заголовки отклика можно изменять только до первой записи в поток отклика.

Note

Из соображений производительности не рекомендуется выполнять несколько вызовов UseOwin. Компоненты OWIN лучше всего работают, когда сгруппированы друг с другом.

app.UseOwin(pipeline =>
{
    pipeline(next =>
    {
        return async environment =>
        {
            // Do something before.
            await next(environment);
            // Do something after.
        };
    });
});

Среда OWIN

Вы можете создать среду OWIN с помощью HttpContext.


   var environment = new OwinEnvironment(HttpContext);
   var features = new OwinFeatureCollection(environment);

Ключи OWIN

OWIN использует объект IDictionary<string,object> для передачи сведений через систему обмена запросами и откликами HTTP. ASP.NET Core реализует указанные ниже ключи. См. основную спецификацию, расширения, а также статью Рекомендации по ключам OWIN и общие ключи.

Данные запроса (OWIN версии 1.0.0)

Key Значение (тип) Description
owin.RequestScheme String
owin.RequestMethod String
owin.RequestPathBase String
owin.RequestPath String
owin.RequestQueryString String
owin.RequestProtocol String
owin.RequestHeaders IDictionary<string,string[]>
owin.RequestBody Stream

Данные запроса (OWIN версии 1.1.0)

Key Значение (тип) Description
owin.RequestId String Optional

Данные отклика (OWIN версии 1.0.0)

Key Значение (тип) Description
owin.ResponseStatusCode int Optional
owin.ResponseReasonPhrase String Optional
owin.ResponseHeaders IDictionary<string,string[]>
owin.ResponseBody Stream

Другие данные (OWIN версии 1.0.0)

Key Значение (тип) Description
owin.CallCancelled CancellationToken
owin.Version String

Общие ключи

Key Значение (тип) Description
ssl.ClientCertificate X509Certificate
ssl.LoadClientCertAsync Func<Task>
server.RemoteIpAddress String
server.RemotePort String
server.LocalIpAddress String
server.LocalPort String
server.OnSendingHeaders Action<Action<object>,object>

SendFiles версии 0.3.0

Key Значение (тип) Description
sendfile.SendAsync См. описание сигнатуры делегата На запрос

Непрозрачная версия 0.3.0

Key Значение (тип) Description
opaque.Version String
opaque.Upgrade OpaqueUpgrade См. описание сигнатуры делегата
opaque.Stream Stream
opaque.CallCancelled CancellationToken

WebSocket v0.3.0

Key Значение (тип) Description
websocket.Version String
websocket.Accept WebSocketAccept См. описание сигнатуры делегата
websocket.AcceptAlt Non-spec
websocket.SubProtocol String См. раздел 4.2.2 RFC6455, шаг 5.5
websocket.SendAsync WebSocketSendAsync См. описание сигнатуры делегата
websocket.ReceiveAsync WebSocketReceiveAsync См. описание сигнатуры делегата
websocket.CloseAsync WebSocketCloseAsync См. описание сигнатуры делегата
websocket.CallCancelled CancellationToken
websocket.ClientCloseStatus int Optional
websocket.ClientCloseDescription String Optional

Дополнительные ресурсы