Otevření webového rozhraní pro .NET (OWIN) s ASP.NET Core
Steve Smith a Rick Anderson
ASP.NET Core:
- Podporuje rozhraní Open Web Interface pro .NET (OWIN).
- Obsahuje náhrady
Microsoft.Owin.*
za knihovny (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 základní aplikace a middleware můžou spolupracovat s aplikacemi, servery a middlewarem založenými na OWIN.
OWIN poskytuje oddělenou vrstvu, která umožňuje použití dvou architektur s různorodými objektovými modely. Balíček Microsoft.AspNetCore.Owin
poskytuje dvě implementace adaptérů:
- ASP.NET Core do OWIN
- OWIN k ASP.NET Core
To umožňuje hostování ASP.NET Core nad serverem nebo hostitelem kompatibilním s OWIN nebo s jinými kompatibilními komponentami OWIN nad ASP.NET Core.
Poznámka:
Používání těchto adaptérů má náklady na výkon. Aplikace používající pouze ASP.NET základní komponenty by neměly používat Microsoft.AspNetCore.Owin
balíčky ani adaptéry.
Zobrazení nebo stažení ukázkového kódu (postup stažení)
Spuštění middlewaru OWIN v kanálu ASP.NET Core
ASP.NET podpora OWIN core se nasadí jako součást Microsoft.AspNetCore.Owin
balíčku. Podporu OWIN můžete do projektu importovat instalací tohoto balíčku.
Middleware OWIN odpovídá specifikaci OWIN, která vyžaduje Func<IDictionary<string, object>, Task>
rozhraní, a konkrétní klíče se nastavují (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);
}
Ukázkový podpis vrátí Task
hodnotu a přijme ji IDictionary<string, object>
podle potřeby OWIN.
Následující kód ukazuje, jak pomocí metody rozšíření přidat OwinHello
middleware (viz výše) do kanálu UseOwin
ASP.NET Core.
public void Configure(IApplicationBuilder app)
{
app.UseOwin(pipeline =>
{
pipeline(next => OwinHello);
});
}
Můžete nakonfigurovat další akce, které se mají provést v rámci kanálu OWIN.
Poznámka:
Hlavičky odpovědi by se měly upravit pouze před prvním zápisem do streamu odpovědi.
Poznámka:
Z důvodů výkonu UseOwin
se nedoporučuje více volání. Komponenty OWIN budou fungovat nejlépe, pokud jsou seskupené dohromady.
app.UseOwin(pipeline =>
{
pipeline(next =>
{
return async environment =>
{
// Do something before.
await next(environment);
// Do something after.
};
});
});
Spusťte ASP.NET Core na serveru založeném na OWIN a použijte podporu pro webSockety.
Dalším příkladem toho, jak mohou být funkce serverů založené na OWIN využívat ASP.NET Core, je přístup k funkcím, jako jsou WebSockets. Webový server .NET OWIN použitý v předchozím příkladu má podporu pro webSockets integrované, což může využít aplikace ASP.NET Core. Následující příklad ukazuje jednoduchou webovou aplikaci, která podporuje WebSockets a vrací vše odeslané na server přes 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);
}
}
Prostředí OWIN
Můžete vytvořit prostředí OWIN pomocí .HttpContext
var environment = new OwinEnvironment(HttpContext);
var features = new OwinFeatureCollection(environment);
Klíče OWIN
OWIN závisí na objektu IDictionary<string,object>
, který komunikuje s informacemi v rámci výměny požadavků a odpovědí HTTP. ASP.NET Core implementuje níže uvedené klíče. Viz primární specifikace, rozšíření a pokyny pro klíče OWIN a běžné klíče.
Vyžádání dat (OWIN v1.0.0)
Klíč | Hodnota (typ) | Popis |
---|---|---|
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 |
Vyžádání dat (OWIN v1.1.0)
Klíč | Hodnota (typ) | Popis |
---|---|---|
owin. ID požadavku | String |
Volitelné |
Data odpovědi (OWIN v1.0.0)
Klíč | Hodnota (typ) | Popis |
---|---|---|
owin. ResponseStatusCode | int |
Volitelné |
owin. ResponseReasonPhrase | String |
Volitelné |
owin. ResponseHeaders | IDictionary<string,string[]> |
|
owin. ResponseBody | Stream |
Další data (OWIN v1.0.0)
Klíč | Hodnota (typ) | Popis |
---|---|---|
owin. CallCancelled | CancellationToken |
|
owin. Verze | String |
Běžné klíče
Klíč | Hodnota (typ) | Popis |
---|---|---|
ssl. ClientCertificate | X509Certificate |
|
ssl. LoadClientCertAsync | Func<Task> |
|
server. RemoteIpAddress | String |
|
server. RemotePort | String |
|
server. LocalIpAddress | String |
|
server. LocalPort | String |
|
server. OnSendingHeaders | Action<Action<object>,object> |
SendFiles v0.3.0
Klíč | Hodnota (typ) | Popis |
---|---|---|
sendfile. SendAsync | Zobrazit podpis delegáta | Na žádost |
Neprůhlený v0.3.0
Klíč | Hodnota (typ) | Popis |
---|---|---|
neprůhledný. Verze | String |
|
neprůhledný. Upgrade | OpaqueUpgrade |
Zobrazit podpis delegáta |
neprůhledný. Proud | Stream |
|
neprůhledný. CallCancelled | CancellationToken |
WebSocket v0.3.0
Klíč | Hodnota (typ) | Popis |
---|---|---|
websocket. Verze | String |
|
websocket. Přijmout | WebSocketAccept |
Zobrazit podpis delegáta |
websocket. AcceptAlt | Nespecované | |
websocket. SubProtocol | String |
Viz RFC6455 oddíl 4.2.2 Krok 5.5 |
websocket. SendAsync | WebSocketSendAsync |
Zobrazit podpis delegáta |
websocket. ReceiveAsync | WebSocketReceiveAsync |
Zobrazit podpis delegáta |
websocket. CloseAsync | WebSocketCloseAsync |
Zobrazit podpis delegáta |
websocket. CallCancelled | CancellationToken |
|
websocket. ClientCloseStatus | int |
Volitelné |
websocket. ClientCloseDescription | String |
Volitelné |
Další materiály
- Podívejte se na zdroj na GitHubu pro klíče OWIN podporované ve vrstvě překladu.
- Middleware
- Servery