- 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
});
});