2012-09-04 53 views
4

我一直在寻找在自托管应用程序中使用ASP.NET Web API和SignalR的可能性,并且我注意到ASP.NET Web API自托管实现使用WCF ,SignalR自托管实施使用System.Net.HttpListener。这使得想出一个组合的自托管解决方案有点困难,但它确实让我想知道为什么不同的项目团队会使用不同的方法。比较自我托管:WCF vs HttpListener

每种方法的优点和缺点是什么?为什么SignalR不能使用WCF自托管或者Web API不能使用HttpListener?有什么特别的理由吗?我知道Web API自托管提供了比SignalR更完整的堆栈,我的问题更多的是关于为什么在实现自己的自托管解决方案时,您会选择通过System.Net.HttpListener执行WCF实现的原因。回到顶端这篇文章中的信息适用于: 。

+0

我一直在寻找比较为什么我会选择'HttpListener'通过WCF,反之亦然,但仍然没有找到一个很好的比较。也许我不够努力。如果有人感兴趣,我已经为Web API和SignalR编写了一个自托管解决方案。它使用'HttpListener'作为一个简单的事实,使得Web API支持'HttpListener'似乎更容易,而让SignalR支持WCF。我希望它是有用的。 https://github.com/jjeffery/WebAppHost –

回答

3

正是如此,我们位于同一页面上,Web API自主主机使用的WCF自主机会在封面下使用HttpListener。不过,我想我可能已经发现了WCF自主主机的一个主要缺点。

我还没有确认,但似乎当您使用Web API Self Host时,您提供的基地址不会直接转换为HttpListener前缀。看起来像WCF翻译主机的基地址和通配符。

这意味着WCF自主机将响应指定端口上的任何主机。这意味着您无法使用不同的主机名在同一端口上与IIS并排运行Web API自托管服务。

这可能是SignalR决定取消WCF自主机并直接使用HTTPListener的原因。

+1

你说得对,WCF在封面下使用了'HttpListener' - 它在顶部添加了它自己的图层。我一直在想知道它增加了什么'HttpListener'。当你在WCF自托管中指定一个URL时,你似乎需要在URL中使用'localhost',这意味着“在任何端口上监听”,这对我的思维方式来说有点奇怪。感谢您的回应。鉴于没有人对这个问题感兴趣(或者想告诉我使用其他的东西,比如OWIN,hostable web core等),我会选择你的答案。 –

6

Web API自身主机提供整个HTTP堆栈,因此它比System.Net.HttpListener丰富得多。

SignalR使用它来纯粹为自己的目的打开一个通信窗口。 所以现在,你需要在不同的端口上并行运行它们。

未来,借助OWIN,您将拥有同一屋檐下的一切。


编辑:有实际上与你相似的问题上SignalR github上提出的,得到的回答是差不多就是我刚才说的 - https://github.com/SignalR/SignalR/issues/277

+0

感谢您的答复Filip,我同意您对Web API的评论有更完整的堆栈,但这不一定与使用WCF编写它有关。我的问题是更多关于System.Net.HttpListener自托管方法与WCF方法的优缺点。我会编辑这个问题,使其更清晰。 –

+0

Web API Self主机基于WCF自身主机,而WCF自身主机又基于HttpListener,所以由于在HTTPListener之上分层了附加功能,它只是“更丰富”。 –

2

虽然你可以使用WCF堆栈自己举办服务,您可能需要考虑“IIS 7.0 Hostable Web Core”。它具有在用户进程中运行IIS的好处。使用这种方法,您可以在同一端口上运行多个应用程序,而不考虑技术。

如果你有兴趣,你可以看看:

  1. Host your own Web Server in your application using IIS 7.0 Hostable Web Core
  2. Creating Hosted Web Core Applications

这一切都假定你正在运行Vista或更高版本...

+0

感谢Werner,我知道宿主Web核心,它在某些情况下可能会有用。在我的情况下,我仍然需要支持Windows XP,所以这次不会有所帮助。我也不确定宿主Web核心是否在未安装IIS的台式机上工作。 –

+0

你不清楚你使用的是哪个操作系统。您可能想尝试tcp端口共享服务,这可能允许您在同一端口的两个进程中托管两个应用程序。尽管我从未在该平台上使用它,但在Windows 2003之前成功使用了它,并在Windows XP中支持了它。 – bloudraak

+0

感谢Werner,只是为了确认我没有那么多问如何将SignalR和Web API结合起来,而是问我为什么要选择通过WCF使用'HttpListener',反之亦然。 –