.NET için Web Arabirimini (OWIN) ASP.NET Core ile açma

Tarafından Steve Smith ve Rick Anderson

ASP.NET Core:

  • .NET (OWIN) için Açık Web Arabirimini destekler.
  • (Katana) kitaplıkları için Microsoft.Owin.* .NET Core uyumlu değiştirmeleri vardır.

OWIN, web uygulamalarının web sunucularından ayrılmış olmasını sağlar. ara yazılımların istekleri ve ilişkili yanıtları işlemek için bir işlem hattında kullanılması için standart bir yol tanımlar. ASP.NET Core uygulamaları ve ara yazılımları OWIN tabanlı uygulamalar, sunucular ve ara yazılım ile birlikte çalışabilir.

OWIN, ayrı nesne modellerine sahip iki çerçevenin birlikte kullanılmasını sağlayan bir ayırma katmanı sağlar. Microsoft.AspNetCore.Owin Paket iki bağdaştırıcı uygulaması sağlar:

  • ASP.NET Core'u OWIN'e
  • OWIN'ASP.NET Core

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

Dekont

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

Örnek kodu görüntüleme veya indirme (indirme)

ASP.NET Core işlem hattında OWIN ara yazılımını çalıştırma

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

OWIN ara yazılımı, bir Func<IDictionary<string, object>, Task> arabirim gerektiren ve belirli anahtarların (örneğinowin.ResponseBody) ayarlanmasını gerektiren OWIN belirtimine uygundur. Aşağıdaki basit OWIN 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 Task döndürür ve OWIN'in gerektirdiği şekilde değerini IDictionary<string, object> kabul eder.

Aşağıdaki kod, uzantı yöntemiyle ara yazılımı (yukarıda gösterilmiştir) ASP.NET Core işlem hattına UseOwin nasıl ekleneceğini OwinHello gösterir.

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

Diğer eylemleri OWIN işlem hattı içinde gerçekleştirilecek şekilde yapılandırabilirsiniz.

Dekont

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

Dekont

Birden çok çağrısı UseOwin performans nedeniyle ö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'u çalıştırın ve WebSockets desteğini kullanın

OWIN tabanlı sunucuların özelliklerinin ASP.NET Core tarafından nasıl kullanılabilmesine yönelik bir diğer örnek de WebSockets gibi özelliklere erişimdir. Önceki örnekte kullanılan .NET OWIN web sunucusu, ASP.NET Core uygulaması tarafından kullanılabilen yerleşik Web Yuvaları desteğine sahiptir. Aşağıdaki örnekte Web Yuvalarını destekleyen ve WebSockets aracılığıyla sunucuya gönderilen her şeyi geri döndüren 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);
    }
}

OWIN ortamı

kullanarak HttpContextbir OWIN ortamı oluşturabilirsiniz.


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

OWIN anahtarları

OWIN, HTTP İsteği/Yanıt değişimi boyunca bilgi iletişim kurmak için bir IDictionary<string,object> nesneye bağımlıdır. ASP.NET Core, aşağıda listelenen anahtarları uygular. Birincil belirtimlere, uzantılara ve OWIN Anahtar Yönergelerine ve Ortak Anahtarlara bakın.

İstek verileri (OWIN v1.0.0)

Tuş Değer (tür) Tanım
Owin'i seçin. RequestScheme String
Owin'i seçin. İstekMethod String
Owin'i seçin. RequestPathBase String
Owin'i seçin. RequestPath String
Owin'i seçin. RequestQueryString String
Owin'i seçin. RequestProtocol String
Owin'i seçin. RequestHeaders IDictionary<string,string[]>
Owin'i seçin. RequestBody Stream

İstek verileri (OWIN v1.1.0)

Tuş Değer (tür) Tanım
Owin'i seçin. Requestıd String İsteğe bağlı

Yanıt verileri (OWIN v1.0.0)

Tuş Değer (tür) Tanım
Owin'i seçin. ResponseStatusCode int İsteğe bağlı
Owin'i seçin. ResponseReasonPhrase String İsteğe bağlı
Owin'i seçin. Responseheaders IDictionary<string,string[]>
Owin'i seçin. ResponseBody Stream

Diğer veriler (OWIN v1.0.0)

Tuş Değer (tür) Tanım
Owin'i seçin. CallCancelled CancellationToken
Owin'i seçin. Sürüm String

Ortak anahtarlar

Tuş Değer (tür) Tanım
Ssl. ClientCertificate X509Certificate
Ssl. LoadClientCertAsync Func<Task>
Sunucu. RemoteIpAddress String
Sunucu. RemotePort String
Sunucu. LocalIpAddress String
Sunucu. Yerel Bağlantı Noktası String
Sunucu. OnSendingHeaders Action<Action<object>,object>

SendFiles v0.3.0

Tuş Değer (tür) Tanım
Sendfile. Sendasync Bkz. temsilci imzası İstek Başına

Opak v0.3.0

Tuş Değer (tür) Tanım
Opak. Sürüm String
Opak. Yükseltme OpaqueUpgrade Bkz. temsilci imzası
Opak. Akışı Stream
Opak. CallCancelled CancellationToken

WebSocket v0.3.0

Tuş Değer (tür) Tanım
Websocket. Sürüm String
Websocket. Kabul WebSocketAccept Bkz. temsilci imzası
Websocket. AcceptAlt Belirtimsiz
Websocket. AltProtocol String Bkz. RFC6455 Bölüm 4.2.2 Adım 5.5
Websocket. Sendasync WebSocketSendAsync Bkz. temsilci imzası
Websocket. ReceiveAsync WebSocketReceiveAsync Bkz. temsilci imzası
Websocket. CloseAsync WebSocketCloseAsync Bkz. temsilci imzası
Websocket. CallCancelled CancellationToken
Websocket. ClientCloseStatus int İsteğe bağlı
Websocket. ClientCloseDescription String İsteğe bağlı

Ek kaynaklar