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:
- Lihat sumber di GitHub untuk kunci OWIN yang didukung di lapisan terjemahan.
- Middleware
- Server
ASP.NET Core