远程连接到 .net 核心自托管网站 api

Remotely connect to .net core self hosted web api

我有一个简单的 .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 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 会导致 404 错误。 (Odin 是机器的名称 运行 在控制台中通过 dotnet 运行 连接网络 api)。

服务器(和客户端!)防火墙都已关闭。我可以成功 ping "odin"。

任何想法我在这里缺少什么简单的步骤。我在家里和工作中都试过了,但都没有成功。

我的猜测是问题不在您的控制器中,而是在 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 不会在本地主机之外侦听。这是有道理的,因为在正常情况下,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,这将允许远程连接到 kestrel。

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

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

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

<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 必须是 运行 管理员。

在我的例子中(.NET 核心 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 服务器侦听来自所有网络接口的流量。

对我们来说,它也是这样工作的(我不知道这是否是核心 3.1 的新功能):

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