After setting up an empty ASP .NET Core Web Application, it’s easy to quickly run it and see something working, in the form of the usual “Hello World”:
When trying to deploy this somewhere though, you might be disappointed to notice that you can’t access the web application from another machine:
In fact, you’ll notice that you can’t even access it from the same machine if you use the actual hostname rather than localhost.
This is because by default, Kestrel will listen only on localhost. In order for another machine to access the web application using the server’s hostname, the web application must specify the endpoints on which Kestrel will listen to, using code or command-line arguments.
Note: you may also need to open a port in your firewall.
In code, this can be done by invoking UseUrls()
in the webhost builder as follows:
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseUrls("http://myhostname:54691") .Build();
Replace “myhostname” with the hostname of the server, and note that the localhost endpoint will still work even though it’s not specified explicitly here.
If you want to pass the the endpoint(s) via command line parameters instead, you can do so via the --urls
argument. First, you need to change the BuildWebHost()
method generated by the project template as per this GitHub comment, to allow command line parameters to be passed to the WebHostBuilder via configuration:
public static IWebHost BuildWebHost(string[] args) { var configuration = new ConfigurationBuilder().AddCommandLine(args).Build(); return WebHost.CreateDefaultBuilder(args) .UseConfiguration(configuration) .UseStartup<Startup>() .Build(); }
Then, use the --urls
argument when invoking dotnet run
:
dotnet run --urls http://banshee:54691/
Either of these methods is fine to allow remote machines to access your ASP .NET Core web application.