问题 如何让ASP.NET Web API(自托管)只监听* localhost?


我正在效仿这个例子 这里 用于自托管的ASP.NET Web API服务。但是,当将“localhost”指定为基址中的主机时,它将被转换为“+”(表示“全部可用”)。

var baseAddress = new Uri("http://localhost:13210");
var configuration = new HttpSelfHostConfiguration(baseAddress);
configuration.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}/{id}",
    defaults: new {id = RouteParameter.Optional});

using (var server = new HttpSelfHostServer(configuration))
{
    server.OpenAsync().Wait();
    stop.WaitOne();
    server.CloseAsync().Wait();
}

我真的希望我的主机只能绑定到“localhost” - 它只能从同一台机器上访问,而且我不想乱用URL ACL。

如何配置Web API  将“localhost”重写为“+”?


7433
2018-06-23 12:31


起源

127.0.0.1/api ? - wal
不。这也被重写了。 - Roger Lipscombe
作为一个workaroud,同时进一步研究如果你添加一个域(例如me.localhost)会发生什么 hosts 映射到127.0.0.1的文件,然后你将webapi列在me.localhost / api上? - wal
谢谢。仅仅根据我的知识,你如何(以及在​​哪一层)找到它被翻译成 +? - KFL
我用过JetBrains dotPeek。 - Roger Lipscombe


答案:


设置你的 HostNameComparisonMode 物业到完全:

var config = new HttpSelfHostConfiguration("https://localhost/api/");
config.HostNameComparisonMode = HostNameComparisonMode.Exact;

看到 本文 有关HostNameComparisonMode的更多信息


9
2018-06-23 12:51



谢谢。我花了一个小时在dotPeek上挖掘。即使有了这些信息,我仍然无法找到实际发生转变的地方。 - Roger Lipscombe
不用担心它实际上是未经测试的,但我知道这个属性存在于WCF上 binding 元素所以我假设传递给端点绑定(不确定webapi以什么形式使用引擎盖下的wcf) - wal
我知道它存在于WCF中,但我认为一旦请求到达就控制验证,而不是控制侦听器实际尝试绑定的内容。 - Roger Lipscombe
@RogerLipscombe它确实传递给了绑定。看到 OnConfigureBinding 在 System.Web.Http.SelfHost.HttpSelfHostConfiguration 第325行 - wal