Open Web Interface for .NET (OWIN) with ASP.NET Core
Steve Smith a Rick Anderson
ASP.NET Core:
- Podporuje rozhraní OWIN (Open Web Interface for .NET).
- Má náhradu za knihovny
Microsoft.Owin.*(Katana)kompatibilní s .NET Core.
OWIN umožňuje oddělení webových aplikací od webových serverů. Definuje standardní způsob použití middlewaru v kanálu ke zpracování požadavků a přidružených odpovědí. ASP.NET Core a middleware může spolupracovat s aplikacemi, servery a middlewarem založenými na OWIN.
OWIN poskytuje oddělenou vrstvu, která umožňuje používat dvě architektury s různorodé objektové modely společně. Balíček Microsoft.AspNetCore.Owin poskytuje dvě implementace adaptéru:
- ASP.NET Core do OWIN
- Z OWIN do ASP.NET Core
To umožňuje ASP.NET Core, aby se hostoval nad serverem nebo hostitelem kompatibilním s OWIN nebo aby se ostatní komponenty kompatibilní s OWIN spouštěl nad ASP.NET Core.
Poznámka
Používání těchto adaptérů má náklady na výkon. Aplikace, které ASP.NET komponenty Core, by neměly balíček Microsoft.AspNetCore.Owin ani adaptéry používat.
Zobrazení nebo stažení ukázkového kódu (stažení)
Spuštění middlewaru OWIN v kanálu ASP.NET Core
ASP.NET součástí balíčku je podpora OWIN Microsoft.AspNetCore.Owin core. Podporu OWIN můžete do svého projektu importovat instalací tohoto balíčku.
Middleware OWIN odpovídá specifikaci OWIN, která vyžaduje rozhraní, a musí být nastaveny konkrétní klíče Func<IDictionary<string, object>, Task> (například owin.ResponseBody ). Následující jednoduchý middleware OWIN zobrazí "Hello World":
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);
}
Vzorový podpis vrátí a Task přijímá , jak vyžaduje IDictionary<string, object> OWIN.
Následující kód ukazuje, jak přidat OwinHello middleware (viz výše) do kanálu ASP.NET Core pomocí UseOwin metody rozšíření.
public void Configure(IApplicationBuilder app)
{
app.UseOwin(pipeline =>
{
pipeline(next => OwinHello);
});
}
Můžete nakonfigurovat další akce, které se budou provádět v rámci kanálu OWIN.
Poznámka
Hlavičky odpovědi by měly být změněny pouze před prvním zápisem do datového proudu odpovědi.
Poznámka
Z důvodů UseOwin výkonu se nedoporučuje více volání metody . Komponenty OWIN budou fungovat nejlépe, pokud jsou seskupeny dohromady.
app.UseOwin(pipeline =>
{
pipeline(next =>
{
return async environment =>
{
// Do something before.
await next(environment);
// Do something after.
};
});
});
Spuštění ASP.NET Core na serveru založeném na OWIN a použití jeho podpory webSocketů
Dalším příkladem toho, jak lze funkce serverů založených na OWIN využít ASP.NET Core, je přístup k funkcím, jako jsou WebSockety. Webový server .NET OWIN použitý v předchozím příkladu má integrovanou podporu webových soketů, kterou může využít aplikace ASP.NET Core. Následující příklad ukazuje jednoduchou webovou aplikaci, která podporuje webové sokety a vrací všechno odeslané na server prostřednictvím protokolu WebSocket.
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);
}
}
Prostředí OWIN
Prostředí OWIN můžete vytvořit pomocí HttpContext .
var environment = new OwinEnvironment(HttpContext);
var features = new OwinFeatureCollection(environment);
Klíče OWIN
OWIN závisí na objektu pro komunikaci informací prostřednictvím výměny IDictionary<string,object> požadavků a odpovědí HTTP. ASP.NET Core implementuje klíče uvedené níže. Viz primární specifikace, rozšířenía pokyny pro klíče OWIN a běžné klíče.
Data požadavku (OWIN v1.0.0)
| Klíč | Hodnota (typ) | Description |
|---|---|---|
| Owin. RequestScheme | String |
|
| Owin. RequestMethod | String |
|
| Owin. RequestPathBase | String |
|
| Owin. RequestPath | String |
|
| Owin. RequestQueryString | String |
|
| Owin. RequestProtocol | String |
|
| Owin. RequestHeaders hostitele | IDictionary<string,string[]> |
|
| Owin. Částmi | Stream |
Data požadavku (OWIN v 1.1.0)
| Klíč | Hodnota (typ) | Description |
|---|---|---|
| Owin. Identifikátor | String |
Volitelné |
Data odpovědi (OWIN v 1.0.0)
| Klíč | Hodnota (typ) | Description |
|---|---|---|
| Owin. ResponseStatusCode | int |
Volitelné |
| Owin. ResponseReasonPhrase | String |
Volitelné |
| Owin. ResponseHeaders hostitele | IDictionary<string,string[]> |
|
| Owin. ResponseBody | Stream |
Jiná data (OWIN v 1.0.0)
| Klíč | Hodnota (typ) | Description |
|---|---|---|
| Owin. CallCancelled | CancellationToken |
|
| owin. Verze | String |
Běžné klíče
| Klíč | Hodnota (typ) | Description |
|---|---|---|
| Ssl. Certifikát klienta | X509Certificate |
|
| Ssl. LoadClientCertAsync | Func<Task> |
|
| Server. Vzdálená IP adresa | String |
|
| Server. Vzdálený port | String |
|
| Server. LocalIpAddress | String |
|
| Server. Místní port | String |
|
| Server. IsLocal | bool |
|
| Server. OnSendingHeaders | Action<Action<object>,object> |
SendFiles v0.3.0
| Klíč | Hodnota (typ) | Description |
|---|---|---|
| sendfile. Sendasync | Viz podpis delegáta. | Na požadavek |
Neprůhledné v0.3.0
| Klíč | Hodnota (typ) | Description |
|---|---|---|
| Neprůhledné. Verze | String |
|
| Neprůhledné. Upgrade | OpaqueUpgrade |
Viz podpis delegáta. |
| Neprůhledné. Proudu | Stream |
|
| Neprůhledné. CallCancelled | CancellationToken |
WebSocket v0.3.0
| Klíč | Hodnota (typ) | Description |
|---|---|---|
| websocket. Verze | String |
|
| websocket. Přijmout | WebSocketAccept |
Viz podpis delegáta. |
| websocket. AcceptAlt | Jiné než specifikace | |
| websocket. Dílčíprotokol | String |
Viz RFC6455 Section 4.2.2 Step 5.5 |
| websocket. Sendasync | WebSocketSendAsync |
Viz podpis delegáta. |
| websocket. ReceiveAsync | WebSocketReceiveAsync |
Viz podpis delegáta. |
| websocket. CloseAsync | WebSocketCloseAsync |
Viz podpis delegáta. |
| websocket. CallCancelled | CancellationToken |
|
| websocket. ClientCloseStatus | int |
Volitelné |
| protokolu WebSocket. ClientCloseDescription | String |
Volitelné |