远程连接到 .net core 自托管 web api

Posted

技术标签:

【中文标题】远程连接到 .net core 自托管 web api【英文标题】:Remotely connect to .net core self hosted web api 【发布时间】:2017-02-05 12:50:31 【问题描述】:

我有一个简单的 .net core web api,只需一个操作:

[Route("[action]")]
public class APIController : Controller

    // GET api/values
    [HttpGet]
    public string Ping()
    
        return DateTime.Now.ToString();
    

如果我通过 dotnet run 运行它,我会得到 ​​p>

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

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

【问题讨论】:

如果您尝试使用“odin”的 IP 地址会发生什么?例如:192.111.11.2:5000?可能是this可以帮助你。 在服务器和客户端都尝试了同样的事情 192.168.1.2 。 127.0.0.1 可以在服务器上运行! 【参考方案1】:

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

【讨论】:

谢谢 - 这行得通!猜猜这种配置确实需要在某种配置文件中...? 或者你可以使用特殊的 ASPNETCORE_URLS 环境变量。不过,我不想在生产中直接听 Kestrel。最好把它放在别的东西后面。 此外,您可以使用.UseUrls("http://*:5000") 来接受来自端口5000 的任何传入请求!【参考方案2】:

最好的办法是调整launchSettings.json,它位于Properties文件夹内。

改变

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

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

这允许 Kestrel Web 服务器侦听来自所有网络接口的流量。

【讨论】:

asp.net core 3.1中有两个applicationUrl部分,我在哪里添加这部分? 您应该将此添加到您用于启动应用程序的任何配置文件中。【参考方案3】:

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

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

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

【讨论】:

在program.cs文件中【参考方案4】:

就我而言(.NET core 2.1)我必须修改Properties/launchSettings.json 文件。

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

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

希望这对那里的人有所帮助。

【讨论】:

这对我来说适用于 .net core 3.1。请注意,它在指定 ip 地址时不起作用。【参考方案5】:

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

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

【讨论】:

是的“记住 Visual Studio 必须以管理员身份运行。”你不会像我一样愚蠢地浪费时间。 :)【参考方案6】:

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

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

【讨论】:

这工作得非常好:)【参考方案7】:

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

【讨论】:

以上是关于远程连接到 .net core 自托管 web api的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core ClientWebSocket:无法连接到服务器

从家庭网络上的 grunt Web 服务器限制 http:// 连接到远程托管 Web 服务器的正确 CORS 条目是啥?

从 linux 的 dot net core 连接到远程 sql server 有时会失败,然后开始随机工作

将托管在 AWS EC2 上的 Asp.net Web api 连接到 AWS API Gateway

Node 在连接到 Postgres 方面比 .NET Core 快 20 倍

技术帖 | 在 Azure 应用服务中生成 .NET Core 和 SQL 数据库 Web 应用