是否可以更改WebServiceHost以避免使用HttpListener?

时间:2010-03-10 14:22:58

标签: c# wcf httplistener

我正在寻找一种方法来使用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服务器但是如果可能的话我想避免这种情况。

在使用WCF提供的所有剩余HTTP脚手架的同时,用标准TCP套接字替换HttpListener的最简单方法是什么?

3 个答案:

答案 0 :(得分:2)

您的问题与HttpListener无关。

你的问题是: *您有一个权限有限的oneClick应用程序 *尝试打开服务器端口。

这是一个矛盾。不受信任的有限权限应用程序不应该打开服务器端口。这就是为什么每个定义都不允许这样做的原因。

您是否尝试过打开正常的套接字端口?它也不应该工作。

通常,有限信任的最终用户应用程序不应托管Web服务;)

那就是说,我在类似的情况下尝试在驱动程序通信场景中使用WCF - 感谢天堂我的应用程序在完全允许的情况下运行。

答案 1 :(得分:1)

您可以通过CustomBinding轻松编写自己的堆栈,使用更高级别的协议内容“按原样”,并滚动您自己的HttpTransport版本,该版本不受HttpListener或IIS支持。可行,当然,但这是很多工作。使用Reflector将现有的HttpTransport位分开 - 那里有很多移动部件。如果你不需要像HTTPS或chunking这样的任何东西,你可能会在一两天内通过Socket破解一个简单的PoC,但是让它变得健壮将是棘手的。 Here是一堆资源的很好的总结(现在可能有点过时了。)

答案 2 :(得分:0)

您还可以查看足够的Cassini,以使其在您的应用中可以托管,并在那里加载WCF管道(通过.svc文件和服务激活处理程序) - 它需要非常写这方面的新代码很少,但仍然给你一个相当健壮和经过测试的网络服务器。