我想在我的WPF应用程序中实现一个简单的自托pipeREST API,它监听本地主机上的特定端口。 该API将被一个网站使用,以便与WPF应用程序通信,如果它正在运行。
没过多久,我遇到了System.ServiceModel.AddressAccessDeniedException错误。 URL必须保留,只有在进程以高权限运行时才能完成。 问题在于,这个应用程序在数千家拥有不同IT策略的公司中使用,这使得应用程序每次启动时都不可能需要pipe理权限。
这是我的testing代码:
_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(); });
有没有办法解决这个问题? 任何我可以使用的第三方软件包? 或者我可以在安装应用程序时保留URL,因为安装需要提升特权? 或者这是一个死胡同?
由于您试图绑定到http://+:12345
,因此您将获得“拒绝访问”,其中+
表示计算机上的所有地址。 如果你显式绑定到localhost
那么(只要你使用一个未使用的端口号),你不应该有任何问题。
自从我上次使用WCF以来,这已经很长时间了,所以我不记得相关的咒语。
就个人而言,如果我这样做,我会调查像NancyFX ,这是比WCF更容易使用,但严格来说,不是本地支持REST,所以你需要在顶部的东西。 例如,请参阅http://engineering.laterooms.com/building-microservices-with-nancy-fx/ 。
而且,如果你决定使用Nancy,那么在监听本地机器上的一个端口而不需要管理员权限的情况下,你需要在配置中指定HostConfiguration.RewriteLocalhost
(或者至少你上次使用了NancyFX )。
在安装过程中运行:
netsh http add urlacl url=http://+:5000/Test/ user=Everyone
请注意,您可以将user
从“ Everyone
限制到登录用户,例如user=MyDomain\John
那么,你不需要管理权限来启动它。 如果您无权使用该网址,则只需要他们。
可以在安装程序中使用ACLURL(工具)来授予用户或程序的权利。 那么在运行时将不需要管理权限。