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 webových soketů integrovaných v aplikaci ASP.NET Core. Následující příklad ukazuje jednoduchou webovou aplikaci, která podporuje webové sokety a vrací zpět vše odeslané na server prostřednictvím 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. Requestid | 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é. Proudu | 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ší prostředky
- Podívejte se na zdroj na GitHubu pro klíče OWIN podporované ve vrstvě překladu.
- Middleware
- Servery
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro