ASP.NET Core ile .NET için Web arabirimi 'ni (OWıN) açın

, Steve Smith ve Rick Anderson tarafından

ASP.NET Core:

  • .NET için açık Web arabirimi 'Ni (OWıN) destekler.
  • Microsoft.Owin.*(Katana) kitaplıklar için .NET Core ile uyumlu değişiklikler içerir.

OWIN, Web uygulamalarının Web sunucularından ayrılmasıyla izin verir. Bu işlem, ara yazılım için istekleri ve ilişkili yanıtları işlemek üzere bir ardışık düzende kullanılması için standart bir yol tanımlar. ASP.NET Core uygulamalar ve ara yazılım, OWıN tabanlı uygulamalar, sunucular ve ara yazılım ile birlikte çalışabilir.

OWIN, farklı nesne modellerinin birlikte kullanılmasına izin veren bir ayrılmış katman sağlar. Microsoft.AspNetCore.OwinPaket iki bağdaştırıcı uygulaması sağlar:

  • OWıN 'a ASP.NET Core
  • ASP.NET Core için OWıN

Bu, ASP.NET Core bir OWIN uyumlu sunucu/konak üzerinde barındırılmasına veya diğer OWIN uyumlu bileşenlerin ASP.NET Core üzerinde çalıştırılmasını sağlar.

Not

Bu bağdaştırıcıların kullanılması bir performans maliyetiyle birlikte gelir. Yalnızca ASP.NET Core bileşenleri kullanan uygulamalar Microsoft.AspNetCore.Owin paketi veya bağdaştırıcıları kullanmaz.

Örnek kodu görüntüleme veya indirme (nasıl indirileceği)

ASP.NET Core ardışık düzeninde OWıN ara yazılımı çalıştırma

ASP.NET Core 'nin OWıN desteği paketin bir parçası olarak dağıtılır Microsoft.AspNetCore.Owin . Bu paketi yükleyerek, OWıN desteğini projenize aktarabilirsiniz.

OWıN ara yazılımı, bir arabirim gerektiren owın belirtimine Func<IDictionary<string, object>, Task> ve belirli anahtarların ayarlanmasını sağlar (örneğin, owin.ResponseBody ). Aşağıdaki basit OWıN ara yazılımı "Merhaba Dünya" görüntüler:

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

    // OWIN Environment Keys: https://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);
}

Örnek imza bir döndürür Task ve IDictionary<string, object> Owin için gereken bir şekilde kabul eder.

Aşağıdaki kod, OwinHello genişletme yöntemi ile ASP.NET Core işlem hattına ara yazılım ekleme (yukarıda gösterilen) gösterilmektedir UseOwin .

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

OWıN ardışık düzeninde gerçekleşecek diğer eylemleri yapılandırabilirsiniz.

Not

Yanıt üst bilgileri yalnızca yanıt akışına ilk yazmaya başlamadan önce değiştirilmelidir.

Not

Performans nedenleriyle birden çok çağrısı UseOwin önerilmez. OWIN bileşenleri, birlikte gruplandırılmışsa en iyi şekilde çalışır.

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

OWIN tabanlı bir sunucuda ASP.NET Core çalıştırın ve WebSockets desteğini kullanın

ASP.NET Core ile OWıN tabanlı sunucuların özelliklerinin nasıl yararlanılabilir, WebSockets gibi özelliklere erişim için bir örnektir. Önceki örnekte kullanılan .NET OWIN Web sunucusu, içinde yerleşik olarak bulunan ve bir ASP.NET Core uygulaması tarafından yararlanılabilir olabilen Web Yuvaları desteği içerir. Aşağıdaki örnekte, Web yuvalarını destekleyen ve WebSockets üzerinden sunucuya gönderilen her şeyi yankılayan basit bir Web uygulaması gösterilmektedir.

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Use(async (context, next) =>
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
                await EchoWebSocket(webSocket);
            }
            else
            {
                await next();
            }
        });

        app.Run(context =>
        {
            return context.Response.WriteAsync("Hello World");
        });
    }

    private async Task EchoWebSocket(WebSocket webSocket)
    {
        byte[] buffer = new byte[1024];
        WebSocketReceiveResult received = await webSocket.ReceiveAsync(
            new ArraySegment<byte>(buffer), CancellationToken.None);

        while (!webSocket.CloseStatus.HasValue)
        {
            // Echo anything we receive
            await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, received.Count), 
                received.MessageType, received.EndOfMessage, CancellationToken.None);

            received = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), 
                CancellationToken.None);
        }

        await webSocket.CloseAsync(webSocket.CloseStatus.Value, 
            webSocket.CloseStatusDescription, CancellationToken.None);
    }
}

OWıN ortamı

Kullanarak bir OWıN ortamı oluşturabilirsiniz HttpContext .


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

OWıN tuşları

OWIN, IDictionary<string,object> BIR http isteği/yanıt değişimi boyunca bilgi iletmek için bir nesneye bağımlıdır. ASP.NET Core aşağıda listelenen anahtarları uygular. Bkz. birincil belirtim, uzantılarve Owın anahtar kılavuzları ve ortak anahtarlar.

İstek verileri (OWıN v 1.0.0)

Anahtar Değer (tür) Description
owın. RequestScheme String
owın. RequestMethod String
owın. RequestPathBase String
owın. Istek yolu String
owın. RequestQueryString String
owın. RequestProtocol String
owın. RequestHeaders IDictionary<string,string[]>
owın. Istek gövdesi Stream

İstek verileri (OWıN v 1.1.0)

Anahtar Değer (tür) Description
owın. No String İsteğe Bağlı

Yanıt verileri (OWIN v 1.0.0)

Anahtar Değer (tür) Description
owın. ResponseStatusCode int İsteğe Bağlı
owın. ResponseReasonPhrase String İsteğe Bağlı
owın. ResponseHeaders IDictionary<string,string[]>
owın. Yanıt gövdesi Stream

Diğer veriler (OWIN v 1.0.0)

Anahtar Değer (tür) Description
owın. Calliptal edildi CancellationToken
owın. Sürüm String

Ortak anahtarlar

Anahtar Değer (tür) Description
SSL. ClientCertificate X509Certificate
SSL. LoadClientCertAsync Func<Task>
Server. Remoteıpaddress String
Server. RemotePort String
Server. LocalIPAddress String
Server. LocalPort String
Server. IsLocal bool
Server. OnSendingHeaders Action<Action<object>,object>

SendFiles v 0.3.0

Anahtar Değer (tür) Description
SendFile. SendAsync Bkz. temsilci imzası Istek başına

Donuk v 0.3.0

Anahtar Değer (tür) Description
ş. Sürüm String
ş. Yükseltmenizi OpaqueUpgrade Temsilci imzasını görme
Opak. Akışı Stream
Opak. CallCancelled CancellationToken

WebSocket v0.3.0

Anahtar Değer (tür) Description
Websocket. Sürüm String
Websocket. Kabul WebSocketAccept Temsilci imzasını görme
Websocket. AcceptAlt Özel olmayan
Websocket. SubProtocol String Bkz. RFC6455 Bölüm 4.2.2 Adım 5.5
Websocket. Sendasync WebSocketSendAsync Temsilci imzasını görme
Websocket. ReceiveAsync WebSocketReceiveAsync Temsilci imzasını görme
Websocket. CloseAsync WebSocketCloseAsync Temsilci imzasını görme
Websocket. CallCancelled CancellationToken
Websocket. ClientCloseStatus int İsteğe Bağlı
Websocket. ClientCloseDescription String İsteğe Bağlı

Ek kaynaklar