Otwieranie interfejsu internetowego dla platformy .NET (OWIN) przy użyciu platformy ASP.NET Core
Przez Steve Smith i Rick Anderson
ASP.NET Core:
- Obsługuje interfejs Open Web Interface for .NET (OWIN).
- Zawiera zamienniki zgodne z platformą .NET Core dla
Microsoft.Owin.*
bibliotek (Katana).
OWIN umożliwia oddzielenie aplikacji internetowych od serwerów internetowych. Definiuje standardowy sposób użycia oprogramowania pośredniczącego w potoku do obsługi żądań i skojarzonych odpowiedzi. ASP.NET Core aplikacje i oprogramowanie pośredniczące mogą współdziałać z aplikacjami opartymi na OWIN, serwerami i oprogramowaniem pośredniczącym.
OWIN udostępnia warstwę rozdzielającą, która umożliwia korzystanie ze sobą dwóch struktur z różnymi modelami obiektów. Pakiet Microsoft.AspNetCore.Owin
zawiera dwie implementacje adapterów:
- ASP.NET Core do OWIN
- OWIN do ASP.NET Core
Umożliwia to hostowanie ASP.NET Core na serwerze/hoście zgodnym z OWIN lub w przypadku innych składników zgodnych Z OWIN, które mają być uruchamiane na podstawie ASP.NET Core.
Uwaga
Korzystanie z tych kart wiąże się z kosztami wydajności. Aplikacje używające tylko składników ASP.NET Core nie powinny używać Microsoft.AspNetCore.Owin
pakietu ani adapterów.
Wyświetl lub pobierz przykładowy kod (jak pobrać)
Uruchamianie oprogramowania pośredniczącego OWIN w potoku ASP.NET Core
obsługa OWIN platformy ASP.NET Core jest wdrażana w ramach Microsoft.AspNetCore.Owin
pakietu. Możesz zaimportować obsługę OWIN do projektu, instalując ten pakiet.
Oprogramowanie pośredniczące OWIN jest zgodne ze specyfikacją OWIN, która wymaga interfejsu Func<IDictionary<string, object>, Task>
i należy ustawić określone klucze (takie jak owin.ResponseBody
). Następujące proste oprogramowanie pośredniczące OWIN wyświetla komunikat "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);
}
Przykładowy podpis zwraca Task
element i akceptuje element zgodnie z IDictionary<string, object>
wymaganiami OWIN.
Poniższy kod pokazuje, jak dodać OwinHello
oprogramowanie pośredniczące (pokazane powyżej) do potoku ASP.NET Core za pomocą UseOwin
metody rozszerzenia.
public void Configure(IApplicationBuilder app)
{
app.UseOwin(pipeline =>
{
pipeline(next => OwinHello);
});
}
Możesz skonfigurować inne akcje do wykonania w potoku OWIN.
Uwaga
Nagłówki odpowiedzi powinny być modyfikowane tylko przed pierwszym zapisem w strumieniu odpowiedzi.
Uwaga
Z powodów związanych z wydajnością zaleca się zniechęcenie wielu UseOwin
wywołań. Składniki OWIN będą działać najlepiej, jeśli zostaną zgrupowane razem.
app.UseOwin(pipeline =>
{
pipeline(next =>
{
return async environment =>
{
// Do something before.
await next(environment);
// Do something after.
};
});
});
Uruchamianie ASP.NET Core na serwerze opartym na protokole OWIN i korzystanie z obsługi obiektów WebSocket
Innym przykładem wykorzystania funkcji serwerów opartych na protokole OWIN przez platformę ASP.NET Core jest dostęp do funkcji, takich jak WebSocket. Serwer internetowy OWIN platformy .NET używany w poprzednim przykładzie ma wbudowaną obsługę obiektów WebSocket, które mogą być używane przez aplikację ASP.NET Core. W poniższym przykładzie przedstawiono prostą aplikację internetową, która obsługuje obiekty WebSocket i powtarza wszystkie elementy wysyłane do serwera za pośrednictwem obiektów 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);
}
}
Środowisko OWIN
Środowisko OWIN można skonstruować przy użyciu polecenia HttpContext
.
var environment = new OwinEnvironment(HttpContext);
var features = new OwinFeatureCollection(environment);
Klucze OWIN
OWIN zależy IDictionary<string,object>
od obiektu do przekazywania informacji w ramach wymiany żądań/odpowiedzi HTTP. ASP.NET Core implementuje klucze wymienione poniżej. Zapoznaj się ze specyfikacją podstawową, rozszerzeniami i kluczowymi wytycznymi OWIN i kluczami wspólnymi.
Żądanie danych (OWIN v1.0.0)
Klucz | Wartość (typ) | opis |
---|---|---|
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 |
Żądanie danych (OWIN w wersji 1.1.0)
Klucz | Wartość (typ) | opis |
---|---|---|
owin. Identyfikator żądania | String |
Opcjonalnie |
Dane odpowiedzi (OWIN v1.0.0)
Klucz | Wartość (typ) | opis |
---|---|---|
owin. ResponseStatusCode | int |
Opcjonalnie |
owin. ResponseReasonPhrase | String |
Opcjonalnie |
owin. OdpowiedźHeaders | IDictionary<string,string[]> |
|
owin. Treść odpowiedzi | Stream |
Inne dane (OWIN v1.0.0)
Klucz | Wartość (typ) | opis |
---|---|---|
owin. CallCancelled | CancellationToken |
|
owin. Wersja | String |
Typowe klucze
Klucz | Wartość (typ) | opis |
---|---|---|
ssl. ClientCertificate | X509Certificate |
|
ssl. LoadClientCertAsync | Func<Task> |
|
serwer. RemoteIpAddress | String |
|
serwer. RemotePort | String |
|
serwer. LocalIpAddress | String |
|
serwer. LocalPort | String |
|
serwer. OnSendingHeaders | Action<Action<object>,object> |
SendFiles v0.3.0
Klucz | Wartość (typ) | opis |
---|---|---|
sendfile. SendAsync | Zobacz podpis delegata | Na żądanie |
Nieprzezroczyste v0.3.0
Klucz | Wartość (typ) | opis |
---|---|---|
nieprzezroczysty. Wersja | String |
|
nieprzezroczysty. Upgrade | OpaqueUpgrade |
Zobacz podpis delegata |
nieprzezroczysty. Strumień | Stream |
|
nieprzezroczysty. CallCancelled | CancellationToken |
WebSocket v0.3.0
Klucz | Wartość (typ) | opis |
---|---|---|
websocket. Wersja | String |
|
websocket. Akceptować | WebSocketAccept |
Zobacz podpis delegata |
websocket. AcceptAlt | Brak specyfikacji | |
websocket. SubProtocol | String |
Zobacz sekcję RFC6455 4.2.2 Krok 5.5 |
websocket. SendAsync | WebSocketSendAsync |
Zobacz podpis delegata |
websocket. ReceiveAsync | WebSocketReceiveAsync |
Zobacz podpis delegata |
websocket. CloseAsync | WebSocketCloseAsync |
Zobacz podpis delegata |
websocket. CallCancelled | CancellationToken |
|
websocket. ClientCloseStatus | int |
Opcjonalnie |
websocket. ClientCloseDescription | String |
Opcjonalnie |
Dodatkowe zasoby
- Zobacz źródło w witrynie GitHub dla kluczy OWIN obsługiwanych w warstwie tłumaczenia.
- Oprogramowanie pośredniczące
- Serwery