如何让我的自托管 WCF 服务不尝试保留 localhost 以外的 url?

Posted

技术标签:

【中文标题】如何让我的自托管 WCF 服务不尝试保留 localhost 以外的 url?【英文标题】:How can I make my self-hosted WCF service NOT try to reserve urls other than localhost? 【发布时间】:2019-04-07 22:35:33 【问题描述】:

我想在 .NET 3.5 桌面应用程序中嵌入一个 REST API。在该框架版本上,只有一个选项:自托管 WCF。

但我似乎无法让它只在 localhost 上监听。

启动时,该应用尝试为http://+:8000 预留网址,但由于我没有以管理员权限运行它,因此失败并显示System.ServiceModel.AddressAccessDeniedException

我希望它只保留http://localhost:8000,从而避免需要管理员权限。

使用HostNameComparisonMode.Exact 似乎没有任何改变。

这是我尝试过的:

using Myservice;
using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Web;

namespace consolehost1

    class Program
    
        static void Main(string[] args)
        
            //Use exact hostname comparison mode
            WebHttpBinding binding = new WebHttpBinding();
            binding.HostNameComparisonMode = HostNameComparisonMode.Exact;

            WebServiceHost host = new WebServiceHost(typeof(Service1), new Uri("http://localhost:8000/"));
            ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IService1), binding, "some-endpoint");

            //The host still tries to get a reservation for http://+:8000 and not just http://localhost:8000
            host.Open();
        
    


我能做什么?

【问题讨论】:

如果你使用http://127.0.0.1:8000/也会发生同样的情况吗? 不幸的是。 【参考方案1】:

下面的命令能解决问题吗?

适用于 Windows Vista、Windows7

netsh http 添加 urlacl url=http://+:8000/MyUriuser=DOMAIN\user

适用于 Windows XP、Server2003。

httpcfg 设置 urlacl /u http://URL:Port/ | https://URL:Port/ /a ACL

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/configuring-http-and-httpshttps://docs.microsoft.com/en-us/windows/desktop/http/add-urlacl 如果问题仍然存在,请随时告诉我。

【讨论】:

很遗憾,这不是一个选项,因为调用 netsh 需要管理员权限。 Http 地址由名为 http.sys 的核心驱动程序管理。当你想让h​​ttp.sys发出请求时,需要注册http命名空间,这是一个需要权限(管理员权限)的操作。 是的。但是注册 localhost(而不是“+”)不需要管理员权限。我只需要本地主机。我希望 WCF 能够理解这一点,而不是尝试保留“+”。就像 OWIN 对 .NET 4+ 所做的那样 当我使用以下命令时,它仍然提示我请求的操作需要权限提升,netsh http add urlacl url=localhost:1900 user=Test 所以我无法理解注册本地主机(而不是"+") 不需要管理员权限。另外,我觉得和WCF没有关系,基于http协议的通信是由http.sys管理的。您介意分享一下 OWIN 处理的类似问题吗? 希望以下链接对您有用。 serverfault.com/questions/822207/…

以上是关于如何让我的自托管 WCF 服务不尝试保留 localhost 以外的 url?的主要内容,如果未能解决你的问题,请参考以下文章

Mono 中的自托管 WCF 服务

想要将 WCF Web 服务作为 Windows 服务托管,而不是在 IIS 中托管

WCF 服务中的自定义证书验证

WCF - 在 nettcpbinding (c#) 中禁用安全性

强大的自托管服务器的最佳选择:WCF 与 ASP.NET Web Api

自托管 WCF 服务和 basicHttpBinding:绑定不提供表示调用者的 Windows 标识