在没有管理权限的本地主机上自托管 REST API

Self-hosted REST API on localhost without administrative privileges

我想在我的 WPF 应用程序中实现一个简单的自承载 REST API,它侦听本地主机上的特定端口。这个 API 将被网站使用,以便与 WPF 应用程序通信,如果它是 运行。

没过多久,我就遇到了System.ServiceModel.AddressAccessDeniedException的错误。 URL 必须保留,只有当进程是 运行 提升的权限时才能这样做。问题在于,该应用程序已在具有不同 IT 策略的数千家公司中使用,这使得该应用程序几乎不可能在每次启动时都需要管理权限。

这是我的测试代码:

    _task = Task.Factory.StartNew(() =>
    {
        var uri = new Uri("http://localhost:5000/test");
        var type = typeof (TestService);
        WebServiceHost host = new WebServiceHost(type, uri);
        WebHttpBinding binding = new WebHttpBinding();
        binding.CrossDomainScriptAccessEnabled = true;
        host.AddServiceEndpoint(type, binding, uri);
        host.Open();
    });

有什么解决办法吗?我可以使用任何第 3 方软件包吗?或者我可以在安装应用程序期间保留 URL 吗,因为安装需要更高的权限?或者这是死胡同?

你得到 "access denied" 因为你试图绑定到 http://+:12345,其中 + 指的是机器上的所有地址。如果你明确地绑定到 localhost 那么(只要你使用一个未使用的端口号)你应该没有任何问题。

自从我上次使用 WCF 以来已经有(很长时间)了,所以我不记得这样做的相关咒语。

就我个人而言,如果我这样做,我会调查类似 NancyFX, which is much easier to use than WCF, but doesn't, strictly speaking, support REST natively, so you'd need to layer something on top. See http://engineering.laterooms.com/building-microservices-with-nancy-fx/ 的内容。

并且,如果您决定使用 Nancy,就无需管理员权限即可在本地计算机上侦听端口而言,您需要在配置中指定 HostConfiguration.RewriteLocalhost(或者,至少,您我上次使用 NancyFX 时做了。

好吧,您不需要管理权限即可启动它。只有在您无权使用 URL.

时才需要它们

ACLURL(工具)可以在安装程序中使用来授予用户或程序的权限。然后在运行时将不需要管理权限。

在安装过程中 运行 这个:

netsh http add urlacl url=http://+:5000/Test/ user=Everyone

请注意,您可以将 userEveryone 限制为登录用户,例如user=MyDomain\John