Search code examples
azureowinkatananancy

Determining application context from OWIN pipeline?


I have an OWIN pipeline using Nancy:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseNancy();
    }
}

The UseNancy() is actually a call to my own custom extension method defined in this gist: https://gist.github.com/TheFastCat/0b7635d9e5795b44e72e

This code is executed both as an Azure Website or an Azure Cloud Service. Based on the context it is executing within I want to use a particular favicon, loaded as an embedded resource from a separate assembly. I do this by specifying separate NancyBootstrappers (each loading the proper favicon for its context).

  1. Is there a more elegant solution to determining the runtime application that is executing the OWIN pipeline? Currently I check app.Properties["host.AppName"] ; however while the Website's app name matches it's assembly configuration, the CloudService app is the name of the Owin startup assembly.class. (see gist). It's cloogey.

  2. Is there a more elegant/simple solution for specifying a custom favicon within Nancy for each of my web applications than creating separate bootstrappers and doing runtime application context checks?


Solution

  • I solved this problem with the help of others on the https://jabbr.net/#/rooms/owin and https://jabbr.net/#/rooms/nancyfx chat boards

    1. Yes. You can contextually check the OWIN host properties:

      if (app.Properties.ContainsKey("System.Net.HttpListener")) { // self hosted application context }

    2.) Yes.

    namespace ClassLib
    {
        public class Startup() 
        { 
            public Startup(byte[] favIcon)  { ... }
    
            public void Configuration(IAppBuilder app) { ... }
        }
    

    }

    [assembly: OwinStartup(typeof(WebHost.Startup))]
    namespace WebHost
    {
        public class Startup() 
        { 
            public voic Configuration(IAppBuilder app)
            {
                new ClassLib.Startup(webhostFavIcon).Configuration(app);
            }
        }
    

    }

    namespace SelfHost
    {
        private class Program() 
        { 
            public void Main(string[] args)
            {
                using(WebApp.Start(app => new ClassLib.Startup(selfHostFavIcon).Configuration(app))
                {}
            }
        }
    }