Run different frameworks side-by-side with OWIN

.net, owin

Solution

Although the use case sounds a bit absurd, you're absolutely right that OWIN enables this. You can compose your pipeline in all kinds of crazy ways.

Straight Pipeline

A typical "straight" pipeline would look something like this:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseWebApi(new MyHttpConfiguration());
        app.MapSignalR();
        app.UseNancy();
    }
}

This will work as follows (given you're hosting on `http://localhost/`)

- WebAPI - `http://localhost/api/*` (default routing)

- SignalR - `http://localhost/signalr` (default route)

- Nancy - `http://localhost/*` (will handle everything else)

Branched Pipeline

You can also create branches in your pipeline:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseWebApi(new MyHttpConfiguration());

        app.Map("/newSite", site =>
        {
            site.MapSignalR();
            site.UseNancy();
        });
    }
}

This will work as follows (given you're hosting on `http://localhost/`)

- WebAPI - `http://localhost/api/*` (default routing)

- SignalR - `http://localhost/newSite/signalr` (default route)

- Nancy - `http://localhost/newSite/*` (will handle everything else)

Problem

My impression of one of the big benefits of Owin is that it makes it easy to run different web frameworks side-by-side without IIS's `IHttpHandler`. (This would be huge for distributing vertical functionality slices as nuget features.) However every tutorial and article I find talks of things like self-host and a single framework. This is not what I'm interested in, I'm interested in running mvc, nancy, web api, maybe even webforms in the same application. Am I wrong about OWIN enabling this? Say I want - Mvc to handle most requests - Webforms to handle requests which have a version=legacy header - Nancy to handle requests to /Nancy/... How would I configure my `Startup` class to enable this?

Original source