- ASP.NET Core supports the Open Web Interface for .NET (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 applications and middleware can interoperate with OWIN-based applications, servers, and middleware.
 
- OWIN provides a decoupling layer that allows two frameworks with disparate object models to be used together.
 
- 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.
- Using these adapters comes with a performance cost.
 
- Applications using only ASP.NET Core components shouldn't use the Owin package or adapters.
 
 
OWIN Middleware in the ASP.NET pipeline
- 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). 
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);
}
- The sample signature returns a 
Task and accepts an IDictionary<string, object> as required by OWIN. 
- 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);
    });
}
- 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.
 
- Multiple calls to 
UseOwin is discouraged for performance reasons. OWIN components will operate best if grouped together. 
 
app.UseOwin(pipeline =>
{
    pipeline(next =>
    {
        // do something before
        return OwinHello;
        // do something after
    });
});