问题
I have a simple .net core web api with one action:
[Route("[action]")]
public class APIController : Controller
{
// GET api/values
[HttpGet]
public string Ping()
{
return DateTime.Now.ToString();
}
}
If I run this via dotnet run I get
Hosting environment: Production
Content root path: C:\Users\xxx\Documents\Visual Studio 2015\Projects\SelfHostTest\src\SelfHostTest
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
Going to the browser and typing in http://localhost:5000/ping results in a successful return of the current time. However going to a remote machine (same LAN) and trying to access the service via http://odin:5000/ping results in a 404 error. (Odin is the name of the machine running the web api in a console via dotnet run).
Both server (and client!) firewalls are turned off. I can ping "odin" successfully.
Any ideas what simple step I am missing here. I've tried this at home and at work with no success.
回答1:
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.
回答2:
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)
回答3:
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.
回答4:
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.
回答5:
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();
}
来源:https://stackoverflow.com/questions/39732279/remotely-connect-to-net-core-self-hosted-web-api