我有一个简单的.net核心网络API,只有一个动作:
[Route("[action]")]
public class APIController : Controller
{
// GET api/values
[HttpGet]
public string Ping()
{
return DateTime.Now.ToString();
}
}
如果我通过dotnet运行,我得到
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.
转到浏览器并输入http://localhost:5000/ping会导致成功返回当前时间。 然而转到远程计算机(相同的LAN)并尝试通过http://odin:5000/ping访问服务会导致404错误。 (Odin是通过dotnet运行在控制台中运行web api的机器的名称。)
服务器(和客户端!)防火墙都已关闭。我可以成功地ping“odin”。
任何想法我在这里缺少什么简单的步骤。我在家里和工作中都试过这个但没有成功。
答案 0 :(得分:20)
我的猜测是问题不在你的控制器中,而是在program.cs中。您需要修改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();
除非你添加UseUrls行,否则Kestrel不会在localhost之外监听。这是有道理的,因为在正常情况下,Kestrel将坐在IIS或NGNIX等反向代理之后,不需要绑定到外部URL。
答案 1 :(得分:7)
最好的方法是调整launchSettings.json
文件夹中的Properties
。
更改
"applicationUrl": "https://localhost:5001"
到
"applicationUrl": "https://0.0.0.0:5001"
这允许Kestrel Web服务器侦听来自所有网络接口的流量。
我写了详细的回复here。
答案 2 :(得分:5)
您只需执行以下操作即可创建WebHost,这将允许远程连接到kestrel。
var host = WebHost.CreateDefaultBuilder(args)
.UseUrls("http://0.0.0.0:80")
.UseStartup<Startup>()
.Build();
使用以下代码后,我仍然无法远程访问我的API,我不得不在Windows控制面板中禁用Docker创建的网络适配器(控制面板\网络和Internet \网络连接)
答案 3 :(得分:3)
对于我的情况(.NET core 2.1),我不得不修改Properties/launchSettings.json
文件。
将applicationUrl
设置为由这样的分号分隔的允许网址列表
"applicationUrl": "https://localhost:5001;http://odin:5000"
希望这可以帮助某个人。
答案 4 :(得分:0)
当本地计算机上有多个IP地址时,有一种更准确的方法。连接UDP套接字并读取其本地端点:
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();
}
答案 5 :(得分:0)
解决此问题的另一种方法是编辑&#34; applicationhost.config&#34;文件。 在项目文件夹中 - &gt; .vs(隐藏文件夹) - &gt;配置 打开&#34; applicationhost.config&#34;文件。在“站点”部分下,站点名称=&#34;您的项目名称&#34;在Bindings节点中添加另一个绑定并使用&#34; IP / Domain&#34;更改localhost。 on&#34; bindingInformation&#34;,像这样:
<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>
请记住Visual Studio必须以管理员身份运行。