我要寻找一种方式来使用WCF WebServiceHost,而不必依赖于HttpListener类和它相关的权限问题(见的这个问题的细节)。

我正在与通过它们的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()将抛出HttpListenerException与错误代码== 5(ERROR_ACCESS_DENIED)。

我们能找到解决这个问题,通过在命令行中运行httpcfg.exe但是这是一个一键式的桌面应用程序,这就是没有真正的长期解决方案为我们。

我们可以抛弃WCF和我们自己写的HTTP服务器,但我想避免,如果可能的。

什么是同时仍然使用所有剩余的HTTP脚手架WCF提供?

这是一个标准的TCP套接字来代替HttpListener最简单的方法
有帮助吗?

解决方案

可以很容易地撰写经由CustomBinding自己的堆栈,使用高层协议的东西“原样”,滚动自己HttpTransport未被HttpListener或IIS支持的版本。 DO-能,肯定的,但它是一个大量的工作。以现有HttpTransport比特相距与Reflector-有在那里运动部件的LOT。你也许可以砍了超过插座一个简单的PoC在一两天,如果你不需要任何幻想如HTTPS或分块,但让它更加强大将是棘手的。 这里'SA提供的大量资源的良好综合报导(现在可以有点陈旧)。

其他提示

您的问题是不相关的HttpListener。

您的问题是: *您必须具有有限权限的一键式应用程序 *试图打开一个服务器端口。

这是一个矛盾。不可信有限许可申请时不应该打开服务器端口。这就是为什么这不是每个定义允许的。

您是否尝试打开一个正常的插座端口?它不应该工作的。

在一般情况下,有限的信任终端用户应用程序不应该托管Web服务)

这是说,我ahve过类似的情况试图在一个驱动程序通信方案中使用WCF - 谢天谢地我的应用程序具有完全的权限运行

您还可以看看翻录足够远的卡西尼,以使其主存中您的应用程序,并加载在那里WCF管道(通过.SVC文件和服务激活处理程序) - 它会需要编写很少的新代码这种方式,但还是给你一个相当稳健和测试Web服务器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top