我正在寻找一种使用WCF WebServiceHost的方法,而不必依赖于HttpListener类及其相关的权限问题(详细信息请参阅this question )。
我正在开发一个应用程序,它通过REST API与另一个(第三方)应用程序进行本地通信。
目前,我们使用WCF作为嵌入式HTTP服务器。我们按如下方式创建一个WebServiceHost:
String hostPath = "http://localhost:" + portNo;
WebServiceHost host = new WebServiceHost(typeof(IntegrationService), new Uri(hostPath));
// create a webhttpbinding for rest/pox and enable cookie support for session management
WebHttpBinding webHttpBinding = new WebHttpBinding();
webHttpBinding.AllowCookies = true;
ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IIntegrationService), webHttpBinding, "");
host.Open()
ChannelFactory<IIntegrationService> cf = new ChannelFactory<IIntegrationService>(webHttpBinding, hostPath);
IIntegrationService channel = cf.CreateChannel();只要我们的应用程序是以管理员身份运行的,一切都运行得很好。如果我们在没有管理权限的机器上运行我们的应用程序,host.Open()将抛出带有ErrorCode == 5 (ERROR_ACCESS_DENIED)的HttpListenerException。
我们可以通过从命令行运行httpcfg.exe来解决这个问题,但这是一个一键式桌面应用程序,对于我们来说,这并不是一个长期的解决方案。
我们可以抛弃WCF,编写自己的HTTP服务器,但如果可能的话,我想避免这种情况。
用标准的TCP套接字替换HttpListener,同时仍然使用WCF提供的所有剩余的HttpListener,最简单的方法是什么?
发布于 2010-03-12 15:55:20
您可以很容易地通过CustomBinding编写自己的堆栈,使用更高级的协议“原样”,并滚动您自己的不受HttpListener或IIS支持的HttpTransport版本。当然,这是可行的,但这是大量的工作。把现有的HttpTransport比特和反射器分开--里面有很多可移动的部分。如果你不需要任何花哨的东西,比如HTTPS或chunking,你可能会在一两天内破解出一个简单的PoC over Socket,但让它变得健壮将是一件棘手的事情。Here是一堆资源的很好的总结(现在可能有点过时了)。
发布于 2010-03-10 22:27:41
您的问题与HttpListener无关。
您的问题是:*您有一个权限有限的oneClick应用程序*试图打开服务器端口。
这是一个矛盾的问题。不受信任的有限权限应用程序不应打开服务器端口。这就是为什么每个定义都不允许这样做。
你有没有试过打开一个普通的插座端口?它也不应该工作。
通常,有限信任最终用户应用程序不应承载web服务;)
也就是说,我曾经在类似的情况下尝试在驱动程序通信场景中使用WCF -谢天谢地,我的应用程序是在完全许可的情况下运行的。
发布于 2010-03-13 06:16:11
你也可以考虑拆分足够多的Cassini,使其可以托管在你的应用程序中,并在其中加载WCF管道(通过.svc文件和服务激活处理程序)-这种方式只需要编写很少的新代码,但仍然可以为你提供一个相当健壮和经过测试的way服务器。
https://stackoverflow.com/questions/2417554
复制相似问题