I have a simple .net core web api with one action:
[Route(\"[action]\")]
public class APIController : Controller
{
// GET api/values
[HttpGet]
pu
My guess is that the issue isn't in your controller, it is in program.cs. You need to modify the construction of your WebHost
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseUrls("http://localhost:5000", "http://odin:5000", "http://192.168.1.2:5000")
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
Unless you add the UseUrls line, Kestrel isn't going to listen outside of localhost. This makes sense, because in a normal situation Kestrel will be sitting behind a reverse proxy like IIS or NGNIX and doesn't need to bind to external URLs.
You can simply do the following to create your WebHost, this will allow remote connections to kestrel.
var host = WebHost.CreateDefaultBuilder(args)
.UseUrls("http://0.0.0.0:80")
.UseStartup<Startup>()
.Build();
After using the following code I still wasn't able to access my API remotely, I had to disable the network adapters created by Docker in the windows control panel (Control Panel\Network and Internet\Network Connections)
There is a more accurate way when there are multi IP addresses available on the local machine. Connect a UDP socket and read its local endpoint:
string localIP;
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
socket.Connect("8.8.8.8", 65530);
IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
localIP = endPoint.Address.ToString();
}
In my case (.NET core 2.1) I had to modify the Properties/launchSettings.json
file.
Set the applicationUrl
to a list of allowed urls separated by semicolons like this
"applicationUrl": "https://localhost:5001;http://odin:5000"
Hope this helps someone out there.
Another way to solve this problem is editing "applicationhost.config" file. in project folder -> .vs (Hidden folder) -> config open "applicationhost.config" file. Under sites section, site name="your project name" in Bindings node add another binding and change localhost with your "IP/Domain" on "bindingInformation", like This:
<site name="project_name" id="2">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="D:\Projects\project_directory" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:5000:localhost" />
<binding protocol="http" bindingInformation="*:5000:192.168.1.2" />
<binding protocol="http" bindingInformation="*:5000:odin" />
</bindings>
</site>
remember Visual Studio must be run as Administrator.
The best way is to adjust the launchSettings.json
, which is located inside the Properties
folder.
Change
"applicationUrl": "https://localhost:5001"
to
"applicationUrl": "https://0.0.0.0:5001"
This allows the Kestrel Web Server to listen for traffic from all Network Interfaces.