Bagikan melalui


Buka Antarmuka Web untuk .NET (OWIN) dengan ASP.NET Core

Oleh Steve Smith dan Rick Anderson

ASP.NET Core:

  • Mendukung Open Web Interface untuk .NET (OWIN).
  • Memiliki penggantian yang kompatibel dengan .NET Core untuk Microsoft.Owin.* pustaka (Katana).

OWIN memungkinkan aplikasi web dipisahkan dari server web. Ini mendefinisikan cara standar agar middleware digunakan dalam alur untuk menangani permintaan dan respons terkait. aplikasi ASP.NET Core dan middleware dapat beroperasi dengan aplikasi, server, dan middleware berbasis OWIN.

OWIN menyediakan lapisan pemisahan yang memungkinkan dua kerangka kerja dengan model objek yang berbeda untuk digunakan bersama-sama. Paket ini Microsoft.AspNetCore.Owin menyediakan dua implementasi adaptor:

  • ASP.NET Core ke OWIN
  • OWIN ke ASP.NET Core

Hal ini memungkinkan ASP.NET Core dihosting di atas server/host yang kompatibel dengan OWIN atau agar komponen kompatibel OWIN lainnya dijalankan di atas ASP.NET Core.

Catatan

Menggunakan adaptor ini dilengkapi dengan biaya performa. Aplikasi yang hanya menggunakan komponen ASP.NET Core tidak boleh menggunakan Microsoft.AspNetCore.Owin paket atau adaptor.

Melihat atau mengunduh kode sampel (cara mengunduh)

Menjalankan middleware OWIN di alur ASP.NET Core

ASP.NET dukungan OWIN Core disebarkan sebagai bagian Microsoft.AspNetCore.Owin dari paket. Anda dapat mengimpor dukungan OWIN ke proyek Anda dengan menginstal paket ini.

Middleware OWIN sesuai dengan spesifikasi OWIN, yang memerlukan Func<IDictionary<string, object>, Task> antarmuka, dan kunci tertentu diatur (seperti owin.ResponseBody). Middleware OWIN sederhana berikut menampilkan "Halo Dunia":

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);
}

Tanda tangan sampel mengembalikan Task dan menerima IDictionary<string, object> sebagaimana diperlukan oleh OWIN.

Kode berikut menunjukkan cara menambahkan OwinHello middleware (ditunjukkan di atas) ke alur ASP.NET Core dengan UseOwin metode ekstensi.

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

Anda dapat mengonfigurasi tindakan lain untuk dilakukan dalam alur OWIN.

Catatan

Header respons hanya boleh dimodifikasi sebelum penulisan pertama ke aliran respons.

Catatan

Beberapa panggilan ke UseOwin tidak disarankan karena alasan performa. Komponen OWIN akan beroperasi paling baik jika dikelompokkan bersama-sama.

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

Jalankan ASP.NET Core di server berbasis OWIN dan gunakan dukungan WebSockets-nya

Contoh lain tentang bagaimana fitur server berbasis OWIN dapat dimanfaatkan oleh ASP.NET Core adalah akses ke fitur seperti WebSockets. Server web .NET OWIN yang digunakan dalam contoh sebelumnya memiliki dukungan untuk WebSocket bawaan, yang dapat dimanfaatkan oleh aplikasi ASP.NET Core. Contoh di bawah ini menunjukkan aplikasi web sederhana yang mendukung WebSocket dan menggemakan kembali semuanya yang dikirim ke server melalui WebSockets.

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);
    }
}

Lingkungan OWIN

Anda dapat membangun lingkungan OWIN menggunakan HttpContext.


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

Kunci OWIN

OWIN bergantung pada IDictionary<string,object> objek untuk mengomunikasikan informasi di seluruh pertukaran Permintaan/Respons HTTP. ASP.NET Core mengimplementasikan kunci yang tercantum di bawah ini. Lihat spesifikasi utama, ekstensi, dan Pedoman Kunci OWIN dan Kunci Umum.

Data permintaan (OWIN v1.0.0)

Tombol Nilai (jenis) Deskripsi
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

Data permintaan (OWIN v1.1.0)

Tombol Nilai (jenis) Deskripsi
owin. RequestId String Opsional

Data respons (OWIN v1.0.0)

Tombol Nilai (jenis) Deskripsi
owin. ResponseStatusCode int Opsional
owin. ResponseReasonPhrase String Opsional
owin. ResponseHeaders IDictionary<string,string[]>
owin. ResponseBody Stream

Data lain (OWIN v1.0.0)

Tombol Nilai (jenis) Deskripsi
owin. CallCancelled CancellationToken
owin. Versi String

Kunci umum

Tombol Nilai (jenis) Deskripsi
ssl. ClientCertificate X509Certificate
ssl. LoadClientCertAsync Func<Task>
peladen. RemoteIpAddress String
peladen. RemotePort String
peladen. LocalIpAddress String
peladen. LocalPort String
peladen. OnSendingHeaders Action<Action<object>,object>

SendFiles v0.3.0

Tombol Nilai (jenis) Deskripsi
sendfile. SendAsync Lihat mendelegasikan tanda tangan Per Permintaan

Buram v0.3.0

Tombol Nilai (jenis) Deskripsi
Buram. Versi String
Buram. Upgrade OpaqueUpgrade Lihat mendelegasikan tanda tangan
Buram. Kali Stream
Buram. CallCancelled CancellationToken

WebSocket v0.3.0

Tombol Nilai (jenis) Deskripsi
websocket. Versi String
websocket. Terima WebSocketAccept Lihat mendelegasikan tanda tangan
websocket. AcceptAlt Non-spesifikasi
websocket. SubProtoklasi String Lihat RFC6455 Bagian 4.2.2 Langkah 5.5
websocket. SendAsync WebSocketSendAsync Lihat mendelegasikan tanda tangan
websocket. ReceiveAsync WebSocketReceiveAsync Lihat mendelegasikan tanda tangan
websocket. CloseAsync WebSocketCloseAsync Lihat mendelegasikan tanda tangan
websocket. CallCancelled CancellationToken
websocket. ClientCloseStatus int Opsional
websocket. ClientCloseDescription String Opsional

Sumber Daya Tambahan: