远程连接到.net 核心自托管的 Web API

我有一个简单的.net 核心 web API,只有一个操作:

[Route("[action]")]
public class APIController : Controller
{
// GET api/values
[HttpGet]
public string Ping()
{
return DateTime.Now.ToString();
}
}

如果我通过网络运行这个,我得到

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 run 在控制台中运行 web api 的机器的名称)。

服务器(和客户端!)的防火墙都关闭了。我可以成功地 ping“ odin”。

你知道我错过了什么样的简单步骤吗? 我在家里和工作中都尝试过,但没有成功。

69999 次浏览

我的猜测是,问题不在您的控制器中,而是在 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。

当本地机器上有多个可用的 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();
}

您可以简单地执行以下操作来创建您的 WebHost,这将允许远程连接到茶隼。

var host = WebHost.CreateDefaultBuilder(args)
.UseUrls("http://0.0.0.0:80")
.UseStartup<Startup>()
.Build();

在使用以下代码之后,我仍然无法远程访问我的 API,我必须禁用由 Docker 在 Windows 控制面板(控制面板网络和 Internet 网络连接)中创建的网络适配器

解决这个问题的另一种方法是编辑“ applicationhost.config”文件。 在项目文件夹-> . vs (隐藏文件夹)-> 配置中 打开“ applicationhost.config”文件。在 site 部分,site name = Bindings 节点中的“ your project name”添加另一个绑定,并在“ bindingInformation”上使用“ IP/Domain”更改 localhost,如下所示:

<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>

请记住,VisualStudio 必须以管理员身份运行。

在我的例子中(. NET core 2.1) ,我必须修改 Properties/launchSettings.json文件。

applicationUrl设置为允许使用分号分隔的 URL 列表,如下所示

"applicationUrl": "https://localhost:5001;http://odin:5000"

希望这能帮到别人。

最好的方法是调整位于 Properties文件夹中的 launchSettings.json

改变

"applicationUrl": "https://localhost:5001"

"applicationUrl": "https://0.0.0.0:5001"

这允许 Kestrel Web 服务器监听来自所有网络接口的通信。

对我们来说,它也是这样工作的(我不知道这是不是 core 3.1的一个新特性) :

 public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseKestrel();
webBuilder.UseIIS();
webBuilder.UseUrls("http://*:8080");
webBuilder.UseStartup<Startup>();
});