.NET (OWIN)에 대 한 웹 인터페이스를 열려면 소개Introduction to Open Web Interface for .NET (OWIN)

Steve SmithRick AndersonBy Steve Smith and Rick Anderson

ASP.NET Core.NET (OWIN)에 대 한 Open Web Interface를 지원합니다.ASP.NET Core supports the Open Web Interface for .NET (OWIN). OWIN 웹 응용 프로그램을 웹 서버에서 분리 될 수 있습니다.OWIN allows web apps to be decoupled from web servers. 요청과 관련된 응답을 처리 하는 파이프라인에 사용할 미들웨어에 대 한 표준 방법을 정의 합니다.It defines a standard way for middleware to be used in a pipeline to handle requests and associated responses. ASP.NET Core 응용 프로그램 및 미들웨어 OWIN 기반 응용 프로그램, 서버 및 미들웨어와 상호 운용이 가능 합니다.ASP.NET Core applications and middleware can interoperate with OWIN-based applications, servers, and middleware.

OWIN 두 프레임 워크를 함께 사용할 수 있는 서로 다른 개체 모델을 허용 하는 분리 계층을 제공 합니다.OWIN provides a decoupling layer that allows two frameworks with disparate object models to be used together. Microsoft.AspNetCore.Owin 패키지는 두 개의 어댑터 구현을 제공 합니다.The Microsoft.AspNetCore.Owin package provides two adapter implementations:

  • OWIN에 대 한 ASP.NET CoreASP.NET Core to OWIN
  • ASP.NET Core에는 OWINOWIN to ASP.NET Core

이렇게 하면 ASP.NET Core를 호스트/OWIN 호환 서버를 기반으로 또는 ASP.NET Core를 기반으로 실행 되도록 다른 OWIN 호환 가능한 구성 요소에 대해 호스팅할 수 있습니다.This allows ASP.NET Core to be hosted on top of an OWIN compatible server/host, or for other OWIN compatible components to be run on top of ASP.NET Core.

참고: 이러한 어댑터를 사용 하 여 성능 비용이 수반 됩니다.Note: Using these adapters comes with a performance cost. Owin 패키지 또는 어댑터에만 ASP.NET Core 구성 요소를 사용 하 여 응용 프로그램 사용 하지 마십시오.Applications using only ASP.NET Core components should not use the Owin package or adapters.

보거나 다운로드 샘플 코드 (다운로드 하는 방법을)View or download sample code (how to download)

ASP.NET 파이프라인에서 OWIN 미들웨어를 실행합니다.Running OWIN middleware in the ASP.NET pipeline

ASP.NET Core OWIN 지원의 일부로 배포 되는 Microsoft.AspNetCore.Owin 패키지 합니다.ASP.NET Core's OWIN support is deployed as part of the Microsoft.AspNetCore.Owin package. 이 패키지를 설치 하 여 OWIN 지원 하 여 프로젝트에 가져올 수 있습니다.You can import OWIN support into your project by installing this package.

OWIN 미들웨어를 준수 하는 OWIN 사양, 요구 하는 Func<IDictionary<string, object>, Task> 인터페이스 및 특정 키 설정 (같은 owin.ResponseBody).OWIN middleware conforms to the OWIN specification, which requires a Func<IDictionary<string, object>, Task> interface, and specific keys be set (such as owin.ResponseBody). 다음과 같은 간단한 OWIN 미들웨어 "Hello World"를 표시합니다.The following simple OWIN middleware displays "Hello World":

public Task OwinHello(IDictionary<string, object> environment)
{
    string responseText = "Hello World via OWIN";
    byte[] responseBytes = Encoding.UTF8.GetBytes(responseText);

    // OWIN Environment Keys: http://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);
}

샘플 서명을 반환는 Task 수락 하 고는 IDictionary<string, object> OWIN에 필요 합니다.The sample signature returns a Task and accepts an IDictionary<string, object> as required by OWIN.

다음 코드를 추가 하는 방법을 보여 줍니다는 OwinHello (위에 표시 된)으로 ASP.NET 파이프라인에 미들웨어는 UseOwin 확장 메서드.The following code shows how to add the OwinHello middleware (shown above) to the ASP.NET pipeline with the UseOwin extension method.

public void Configure(IApplicationBuilder app)
{
    app.UseOwin(pipeline =>
    {
        pipeline(next => OwinHello);
    });
}

OWIN 파이프라인 내에서 수행 하는 기타 작업을 구성할 수 있습니다.You can configure other actions to take place within the OWIN pipeline.

참고

응답 헤더 응답 스트림에 최초 쓰기 전에 수정 되어야 합니다.Response headers should only be modified prior to the first write to the response stream.

참고

여러 번 호출 UseOwin 은 성능상의 이유로 권장 되지 않음.Multiple calls to UseOwin is discouraged for performance reasons. OWIN 구성 요소는 함께 그룹화 하는 경우 가장 잘 작동 합니다.OWIN components will operate best if grouped together.

app.UseOwin(pipeline =>
{
    pipeline(next =>
    {
        // do something before
        return OwinHello;
        // do something after
    });
});

<a name=hosting-on-owin>

OWIN 기반 서버에서 ASP.NET 호스팅를 사용 하 여Using ASP.NET Hosting on an OWIN-based server

OWIN 기반 서버 ASP.NET 응용 프로그램을 호스팅할 수 있습니다.OWIN-based servers can host ASP.NET applications. 이러한 서버도 Nowin,.NET OWIN 웹 서버.One such server is Nowin, a .NET OWIN web server. 이 문서에 대 한 샘플에서는 Nowin 참조 하 고 만드는 데 사용 하는 프로젝트를 추가 했습니다는 IServer ASP.NET Core를 자체 호스트할 수 있습니다.In the sample for this article, I've included a project that references Nowin and uses it to create an IServer capable of self-hosting ASP.NET Core.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;

namespace NowinSample
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseNowin()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

            host.Run();
        }
    }
}

IServer필요로 하는 인터페이스는 Features 속성 및 Start 메서드.IServer is an interface that requires an Features property and a Start method.

Start구성 하 고이 경우에 일련의 구문 분석 하는 주소는 IServerAddressesFeature 설정 하는 fluent API 호출을 통해 수행 된 서버를 시작 하는 일을 담당 합니다.Start is responsible for configuring and starting the server, which in this case is done through a series of fluent API calls that set addresses parsed from the IServerAddressesFeature. fluent 구성을 _builder 요청에서 처리 되는 변수를 지정는 appFunc 메서드 이전에 정의 된 합니다.Note that the fluent configuration of the _builder variable specifies that requests will be handled by the appFunc defined earlier in the method. Func 들어오는 요청을 처리할을 요청할 때마다 호출 됩니다.This Func is called on each request to process incoming requests.

추가 IWebHostBuilder 확장을 쉽게 추가 하 고 Nowin 서버를 구성 합니다.We'll also add an IWebHostBuilder extension to make it easy to add and configure the Nowin server.

using System;
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.Extensions.DependencyInjection;
using Nowin;
using NowinSample;

namespace Microsoft.AspNetCore.Hosting
{
    public static class NowinWebHostBuilderExtensions
    {
        public static IWebHostBuilder UseNowin(this IWebHostBuilder builder)
        {
            return builder.ConfigureServices(services =>
            {
                services.AddSingleton<IServer, NowinServer>();
            });
        }

        public static IWebHostBuilder UseNowin(this IWebHostBuilder builder, Action<ServerBuilder> configure)
        {
            builder.ConfigureServices(services =>
            {
                services.Configure(configure);
            });
            return builder.UseNowin();
        }
    }
}

이 위치를에서 확장을 호출 하 여 사용자 지정이 서버를 사용 하 여 ASP.NET 응용 프로그램을 실행 하는 데 필요한에 있는 모든 Program.cs:With this in place, all that's required to run an ASP.NET application using this custom server to call the extension in Program.cs:


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;

namespace NowinSample
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseNowin()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

            host.Run();
        }
    }
}

ASP.NET에 대 한 자세한 서버합니다.Learn more about ASP.NET Servers.

OWIN 기반 서버에서 ASP.NET Core를 실행 하 고 해당 Websocket 지원 사용Run ASP.NET Core on an OWIN-based server and use its WebSockets support

OWIN 기반 서버의 기능의 또 다른 예를 활용 하 여 ASP.NET 코어는 Websocket 같은 기능에 액세스 합니다.Another example of how OWIN-based servers' features can be leveraged by ASP.NET Core is access to features like WebSockets. 이전 예제에서 사용 되는.NET OWIN 웹 서버에 ASP.NET Core 응용 프로그램에서 사용할 수 있는 기본 제공 되는 웹 소켓에 대 한 지원.The .NET OWIN web server used in the previous example has support for Web Sockets built in, which can be leveraged by an ASP.NET Core application. 다음 예제에서는 Websocket을 지원 하 고 Websocket 통해 서버에 보낸 모든 항목이 다시 에코 하는 단순한 웹 앱을 보여 줍니다.The example below shows a simple web app that supports Web Sockets and echoes back everything sent to the server through 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);
    }
}

샘플 동일한을 사용 하도록 구성 NowinServer 는 이전 쿼리에서와-응용 프로그램의 구성 되는 방식에서 유일한 차이점은 해당 Configure 메서드.This sample is configured using the same NowinServer as the previous one - the only difference is in how the application is configured in its Configure method. 사용 하 여 테스트 간단한 websocket 클라이언트가 응용 프로그램을 보여 줍니다.A test using a simple websocket client demonstrates the application:

웹 소켓 테스트 클라이언트

OWIN 환경입니다.OWIN environment

사용 하 여 OWIN 환경을 구성할 수는 HttpContext합니다.You can construct a OWIN environment using the HttpContext.


   var environment = new OwinEnvironment(HttpContext);
   var features = new OwinFeatureCollection(environment);

OWIN 키OWIN keys

OWIN에 따라 달라 집니다는 IDictionary<string,object> HTTP 요청/응답 exchange 전체에서 정보를 전달 하는 개체입니다.OWIN depends on an IDictionary<string,object> object to communicate information throughout an HTTP Request/Response exchange. ASP.NET Core 아래에 나열 된 키를 구현 합니다.ASP.NET Core implements the keys listed below. 참조는 기본 사양, 확장명, 및 OWIN 키 지침 및 공통 키합니다.See the primary specification, extensions, and OWIN Key Guidelines and Common Keys.

요청 데이터 (OWIN v1.0.0)Request Data (OWIN v1.0.0)

KeyKey 값 (형식)Value (type) 설명Description
owin 합니다. RequestSchemeowin.RequestScheme String
owin 합니다. RequestMethodowin.RequestMethod String
owin 합니다. RequestPathBaseowin.RequestPathBase String
owin 합니다. RequestPathowin.RequestPath String
owin 합니다. RequestQueryStringowin.RequestQueryString String
owin 합니다. RequestProtocolowin.RequestProtocol String
owin 합니다. RequestHeadersowin.RequestHeaders IDictionary<string,string[]>
owin 합니다. RequestBodyowin.RequestBody Stream

요청 데이터 (OWIN v1.1.0)Request Data (OWIN v1.1.0)

KeyKey 값 (형식)Value (type) 설명Description
owin 합니다. 요청 Idowin.RequestId String OptionalOptional

응답 데이터 (OWIN v1.0.0)Response Data (OWIN v1.0.0)

KeyKey 값 (형식)Value (type) 설명Description
owin 합니다. ResponseStatusCodeowin.ResponseStatusCode int OptionalOptional
owin 합니다. ResponseReasonPhraseowin.ResponseReasonPhrase String OptionalOptional
owin 합니다. ResponseHeadersowin.ResponseHeaders IDictionary<string,string[]>
owin 합니다. ResponseBodyowin.ResponseBody Stream

다른 데이터 (OWIN v1.0.0)Other Data (OWIN v1.0.0)

KeyKey 값 (형식)Value (type) 설명Description
owin 합니다. CallCancelledowin.CallCancelled CancellationToken
owin 합니다. 버전owin.Version String

공통 키Common Keys

KeyKey 값 (형식)Value (type) 설명Description
ssl 합니다. ClientCertificatessl.ClientCertificate X509Certificate
ssl 합니다. LoadClientCertAsyncssl.LoadClientCertAsync Func<Task>
서버입니다. RemoteIpAddressserver.RemoteIpAddress String
서버입니다. 포트 원격 포트server.RemotePort String
서버입니다. LocalIpAddressserver.LocalIpAddress String
서버입니다. LocalPortserver.LocalPort String
서버입니다. IsLocalserver.IsLocal bool
서버입니다. OnSendingHeadersserver.OnSendingHeaders Action<Action<object>,object>

SendFiles v0.3.0SendFiles v0.3.0

KeyKey 값 (형식)Value (type) 설명Description
sendfile 합니다. SendAsyncsendfile.SendAsync 참조 대리자 시그니처See delegate signature 요청에 따라Per Request

불투명 v0.3.0Opaque v0.3.0

KeyKey 값 (형식)Value (type) 설명Description
불투명 합니다. 버전opaque.Version String
불투명 합니다. 업그레이드opaque.Upgrade OpaqueUpgrade 참조 대리자 시그니처See delegate signature
불투명 합니다. 스트림opaque.Stream Stream
불투명 합니다. CallCancelledopaque.CallCancelled CancellationToken

WebSocket v0.3.0WebSocket v0.3.0

KeyKey 값 (형식)Value (type) 설명Description
websocket입니다. 버전websocket.Version String
websocket입니다. 허용websocket.Accept WebSocketAccept 참조 대리자 시그니처See delegate signature
websocket입니다. AcceptAltwebsocket.AcceptAlt 비-사양Non-spec
websocket입니다. 하위 프로토콜websocket.SubProtocol String 참조 RFC6455 섹션 4.2.2 5.5 단계See RFC6455 Section 4.2.2 Step 5.5
websocket입니다. SendAsyncwebsocket.SendAsync WebSocketSendAsync 참조 대리자 시그니처See delegate signature
websocket입니다. ReceiveAsyncwebsocket.ReceiveAsync WebSocketReceiveAsync 참조 대리자 시그니처See delegate signature
websocket입니다. CloseAsyncwebsocket.CloseAsync WebSocketCloseAsync 참조 대리자 시그니처See delegate signature
websocket입니다. CallCancelledwebsocket.CallCancelled CancellationToken
websocket입니다. ClientCloseStatuswebsocket.ClientCloseStatus int OptionalOptional
websocket입니다. ClientCloseDescriptionwebsocket.ClientCloseDescription String OptionalOptional

추가 리소스Additional Resources