远程连接到.net核心自托管的web api

时间:2016-09-27 18:52:23

标签: c# asp.net-web-api .net-core self-hosting

我有一个简单的.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”。

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

6 个答案:

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