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

C# 是否可以更改WebServiceHost以避免使用HttpListener?,c#,wcf,httplistener,C#,Wcf,Httplistener,我正在寻找一种使用WCF WebServiceHost的方法,而不必依赖HttpListener类及其相关的权限问题(有关详细信息,请参阅) 我正在开发一个通过RESTAPI与另一个(第三方)应用程序进行本地通信的应用程序 目前,我们正在使用WCF作为嵌入式HTTP服务器。我们创建一个WebServiceHost,如下所示: String hostPath = "http://localhost:" + portNo; WebServiceHost host = new WebServiceHo

我正在寻找一种使用WCF WebServiceHost的方法,而不必依赖HttpListener类及其相关的权限问题(有关详细信息,请参阅)

我正在开发一个通过RESTAPI与另一个(第三方)应用程序进行本地通信的应用程序

目前,我们正在使用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();
String主机路径=”http://localhost:“+portNo;
WebServiceHost主机=新的WebServiceHost(typeof(IntegrationService),新的Uri(hostPath));
//为rest/pox创建webhttpbinding,并为会话管理启用cookie支持
WebHttpBinding WebHttpBinding=新的WebHttpBinding();
webHttpBinding.AllowCookies=true;
ServiceEndpoint ep=host.AddServiceEndpoint(类型为(IIntegrationService),webHttpBinding,“”);
host.Open()
ChannelFactory cf=新的ChannelFactory(webHttpBinding,hostPath);
IIntegrationService通道=cf.CreateChannel();
只要我们的应用程序以管理员身份运行,一切都能正常工作。如果我们在没有管理权限的机器上运行应用程序,host.Open()将抛出一个HttpListenerException,错误代码==5(错误\访问\拒绝)

我们可以通过从命令行运行httpcfg.exe来解决这个问题,但这是一个一键桌面应用程序,对我们来说并不是一个长期的解决方案

我们可以抛弃WCF,编写自己的HTTP服务器,但如果可能的话,我希望避免这种情况


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

您的问题与HttpListener无关

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

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

你试过打开一个普通的插座端口吗?它也不应该起作用

通常,有限信任最终用户应用程序不应承载web服务;)


也就是说,我也遇到过类似的情况,试图在驱动程序通信场景中使用WCF-谢天谢地,我的应用程序是在完全许可的情况下运行的。

您可以通过CustomBinding轻松编写自己的堆栈,使用更高级别的协议内容“按原样”,以及滚动您自己的HttpTransport版本,该版本不受HttpListener或IIS支持。当然可以,但工作量很大。用反射器将现有的http传输位拆开,里面有很多活动部件。如果你不需要像HTTPS或分块这样的花哨东西,你可能会在一两天内通过Socket破解出一个简单的PoC,但要使其健壮将是一件棘手的事情这是一个很好的资源包(现在可能有点过时了)。

您还可以考虑剥离足够多的资源,使其在应用程序中成为主机,并在其中加载WCF管道(通过.svc文件和服务激活处理程序)-这样只需编写很少的新代码,但仍然可以为您提供一个相当健壮且经过测试的Web服务器

我很感激你所说的,但我只是仔细检查了一下,在这种情况下可以打开一个正常的监听插座。这一问题尤其与HttpListener有关——可能是因为它允许恶意应用程序与其他应用程序在同一端口上运行(因此流量可能会进入防火墙——请参阅了解更多详细信息)。事实上,无论我们如何部署应用程序,当以有限用户身份运行时,我们都会遇到同样的问题,并且有很多真正的理由希望这样做。感谢链接-这就是我得出的结论。不幸的是,我想从中派生的几乎所有类(HttpChannelListener、HttpTransportManager等)都标记为内部类,所以您是对的,需要大量的重新实现。呵呵。我们不需要任何花哨的东西,所以我最终推出了自己的小型HTTP服务器,它能够理解我们预先存在的服务合同。大量的内部类和私有方法使得WCF实现过于耗时,令人羞愧。同意-我做过类似的事情,WCF REST的东西落在了我们身上,我们不得不改变的一件小事是在HttpTransport中太过深入而不值得。我甚至可以通过调整内部成员使其在调试器中工作,但对于real.ErrorCode==5(ERROR\u ACCESS\u DENIED):“netsh http urlacl”是您授予自己访问http侦听器保留地址的方式。