Web API自托管 - 绑定到所有网络接口

33

如何使Web API自托管绑定到所有网络接口?

目前我有以下代码,但它只能绑定到本地主机。因此,无法从本地主机以外的位置访问该服务器。

var baseAddress = string.Format("http://localhost:9000/"); 
            using (WebApp.Start<Startup> (baseAddress)) 
            {
                Console.WriteLine("Server started");
                Thread.Sleep(1000000);
            }
2个回答

46

只需像这样更改基地址

        var baseAddress = "http://*:9000/"; 
        using (WebApp.Start<Startup> (baseAddress)) 
        {
            Console.WriteLine("Server started");
            Thread.Sleep(1000000);
        }

而且它应该正确地绑定到所有接口。


9
我看到有人使用http://+:9000/。+和*之间有什么区别?@mauriciod73 - regisbsb
10
如果你遇到"Target Invocation Exception"和"Access is denied"的错误提示,需要以管理员身份运行Visual Studio。 - Fidel
21
“+”和“”有什么区别?请参见UrlPrefix Strings。这里的“+”是强通配符,“”是弱通配符。“强”在这里指的是对于传入请求的主机名,先检查该绑定,而弱绑定(“*”)会应用于其他任何绑定之后,例如那些指定显式主机名的绑定。因此,您可以设置绑定以根据传入URL提供不同的资源,并且“*”绑定会捕获未明确绑定的任何内容。 - redcalx
1
感谢 Fidel(http://stackoverflow.com/users/171846/fidel)!!!以管理员身份运行是我的问题所在。 - SilentNot
1
不建议使用通配符绑定。引用:“不应使用顶级通配符绑定(http:// :80 /和http:// +:80)。顶级通配符绑定会创建应用程序安全漏洞。这适用于强和弱通配符。与通配符相比,使用显式主机名或IP地址更为安全。如果您控制整个父域(而不是.com),则子域通配符绑定(例如*.mysub.com)不会存在安全风险。”_ https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/httpsys?view=aspnetcore-3.1 - tjmoore
显示剩余2条评论

12

如果您遇到访问异常,请不要以管理员用户身份启动Visual Studio,而应添加URL保留。以下示例假定您希望在所有端口和主机名(http://+:9000/)上打开端口9000作为HTTP服务,并且没有任何用户限制。

请以管理员身份启动命令控制台窗口并执行:

netsh
netsh> http add urlacl url="http://+:9000/" sddl=D:(A;;GX;;;S-1-1-0)
SDDL翻译成"所有用户",来自您当前域/计算机。相应地修改您的代码。
var baseAddress = "http://+:9000/";
using (WebApp.Start<Startup> (baseAddress)) 
{
  // your code here
}

您可以通过执行以下命令来删除预订:

netsh
netsh> http delete urlacl url="http://+:9000/"

然而,微软建议避免使用顶级通配符绑定,参见:

有关 http://*:9000/http://+:9000/ 之间差异的更多信息,请参见:


我该如何移除它?在这样做之后,我就不能再使用字符串baseAddress =“http://localhost:9000/”了... - eri0o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接