Skip to content

Instantly share code, notes, and snippets.

@darrelmiller
Created November 30, 2013 18:31
Show Gist options
  • Save darrelmiller/7722664 to your computer and use it in GitHub Desktop.
Save darrelmiller/7722664 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.Owin;
using Microsoft.Owin;
using Microsoft.Owin.BuilderProperties;
using Microsoft.Owin.Host.HttpListener;
namespace SampleServer
{
public static class OwinHttpListenerHelper
{
public static IDisposable CreateHttpListenerServer(Uri baseAddress, OwinMiddleware middleware)
{
var props = new Dictionary<string, object>();
var address = Address.Create();
address.Host = baseAddress.Host;
address.Port = baseAddress.Port.ToString();
address.Scheme = baseAddress.Scheme;
address.Path = baseAddress.AbsolutePath;
props["host.Addresses"] = new List<IDictionary<string, object>> { address.Dictionary };
OwinServerFactory.Initialize(props);
var server = OwinServerFactory.Create((env) => middleware.Invoke(new OwinContext(env)), props);
return server;
}
}
public class OwinPipelineBuilder
{
private readonly List<Func<OwinMiddleware, OwinMiddleware>> _list = new List<Func<OwinMiddleware, OwinMiddleware>>();
public OwinPipelineBuilder Add(Func<OwinMiddleware, OwinMiddleware> owinMiddlewareFactory)
{
_list.Add(owinMiddlewareFactory);
return this;
}
public OwinMiddleware Build()
{
OwinMiddleware next = null;
foreach (var factory in Enumerable.Reverse(_list))
{
next = factory(next);
}
return next;
}
}
public class WebApiOwinMiddleware : OwinMiddleware
{
private readonly HttpMessageHandlerAdapter _handler;
public WebApiOwinMiddleware(HttpConfiguration config, OwinMiddleware next)
: base(next)
{
var app = new HttpServer(config);
_handler = new HttpMessageHandlerAdapter(next, app, new OwinBufferPolicySelector());
}
public override Task Invoke(IOwinContext context)
{
return _handler.Invoke(context);
}
}
}
+ var baseAddress = new Uri("http://birch:1001/");
+
+
+ var app = new OwinPipelineBuilder()
+ .Add((next) => new OwinMiddleware1(next))
+ .Add((next) => new OwinMiddleware2(next))
+ .Add((next) =>
+ {
+ var config = new HttpSelfHostConfiguration(baseAddress);
+ Configure(config);
+ return new WebApiOwinMiddleware(config, next);
+ })
+ .Build();
+
+
+ var server = OwinHttpListenerHelper.CreateHttpListenerServer(baseAddress, app);
+
+ Console.WriteLine("Started");
+ Console.ReadKey();
+ Console.WriteLine("Stopped");
+
+ server.Dispose();
+
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment