15
votes

It is possible to run a suave.io app on Azure Web Apps because of an IIS8 feature called HttpPlatformHandler. I tried to run a self-hosted OWIN application the same way, but got an exception on startup:

Unhandled Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Net.HttpListenerException: Access is denied
   at System.Net.HttpListener.SetupV2Config()
   at System.Net.HttpListener.Start()
   at Microsoft.Owin.Host.HttpListener.OwinHttpListener.Start(HttpListener listener, Func`2 appFunc, IList`1 addresses, IDictionary`2 capabilities, Func`2 loggerFactory)
   at Microsoft.Owin.Host.HttpListener.OwinServerFactory.Create(Func`2 app, IDictionary`2 properties)
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.Owin.Hosting.ServerFactory.ServerFactoryAdapter.Create(IAppBuilder builder)
   at Microsoft.Owin.Hosting.Engine.HostingEngine.StartServer(StartContext context)
   at Microsoft.Owin.Hosting.Engine.HostingEngine.Start(StartContext context)
   at Microsoft.Owin.Hosting.Starter.DirectHostingStarter.Start(StartOptions options)
   at Microsoft.Owin.Hosting.Starter.HostingStarter.Start(StartOptions options)
   at Microsoft.Owin.Hosting.WebApp.StartImplementation(IServiceProvider services, StartOptions options)
   at Microsoft.Owin.Hosting.WebApp.Start(StartOptions options)
   at Microsoft.Owin.Hosting.WebApp.Start[TStartup](StartOptions options)
   at Microsoft.Owin.Hosting.WebApp.Start[TStartup](String url)
   at WebAppSample.Program.Main(String[] args) in c:\Users\egger\Workspace\WebAppSample\WebAppSample\Program.cs:line 14

It seems that I am not allowed to open a port. My web.config looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <remove name="httpplatformhandler" />
            <add name="httpplatformhandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
        </handlers>
        <httpPlatform
            stdoutLogEnabled="true"
            stdoutLogFile="site.log"
            startupTimeLimit="20"
            processPath="%HOME%\site\wwwroot\WebAppSample.exe"
            arguments="%HTTP_PLATFORM_PORT%">
        </httpPlatform>
    </system.webServer>
</configuration>

I use HTTP_PLATFORM_PORT to listen on the right port. My web app starts the server as follows:

class Program
{
    static void Main(string[] args)
    {
        var port = int.Parse(args[0]);
        var url = string.Format("http://127.0.0.1:{0}", port);
        Console.WriteLine("Starting web app at {0}", url);
        using (WebApp.Start<Startup>(url))
        {
            Console.ReadLine();
        }
    }
}
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseErrorPage();
        app.UseWelcomePage("/");
    }
}

The URL seems to be OK because I get output like this: Starting web app at http://127.0.0.1:32880.

The web.config and all the binaries are in the root directory and I published the app using a local git repo.

Why can't I open the port using OWIN? What's different from the suave.io sample?

EDIT: I just saw there is a request to support this exact scenario: https://feedback.azure.com/forums/169385-web-apps-formerly-websites/suggestions/4606121-support-owin-self-hosting-in-azure-websites

1
It's probably silent here because of the //Build conference. I'll be patient for another few days :-)Johannes Egger
Did you ever find an answer for this? I am deploying quite a few F# apps and services using the HttpPlatformHandler trick, but am trying to get up and running with a signalr server using OWIN and F# and nothing is 'just working'.tigerswithguitars
We never tried again. The app currently runs in a worker role.Johannes Egger
Thanks. Good to know.tigerswithguitars

1 Answers

5
votes

I Had the same problem. Solved simply by running Visual Studio as Admin.

(You may need to restart the Azure Emulator as well)