C# 中 HttpListener 和 Griffin.WebServer 的替代方案

Posted

技术标签:

【中文标题】C# 中 HttpListener 和 Griffin.WebServer 的替代方案【英文标题】:Alternative to HttpListener and Griffin.WebServer in C# 【发布时间】:2017-10-18 22:28:44 【问题描述】:

简而言之,我正在寻找在 .Net Framework 应用程序(例如 Windows 窗体)中提供 REST 或 SOAP API 服务器的最佳方法 - 在某些情况下无需管理员权限

目前在可能的可移植 csharp 应用程序中提供基于 Web 的 REST 或 SOAP API 的最佳方式是什么? 基本上我需要开箱即用支持基本 http 标准的东西(例如 Expect: 100-continue 等),同时能够直接实例化我的 csharp 程序的类(性能和易于使用的原因)。

微软的方式是要么使用 IIS 和可能的 ASP,要么使用 httplistener。 IIS 永远无法以可移植的方式运行,并且需要大量基于安装过程/系统管理的工作。另一方面,httlistener 甚至还没有成为网络服务器,我需要自己实现所有标准的网络服务器命令。

多年来我一直在寻找这个话题,一个例子是这个问题[老问题]Alternative to HttpListener?

不幸的是,这个链接指向一个已停止的项目。

有什么想法吗?

[编辑] 该问题不仅针对 C#,还针对 .NET Framework 2-4.5。结果应该可用于例如Windows 窗体、Windows 服务和命令行应用程序。

目前我正在使用基于 HTTPListener 的骨架 Web 服务器,因此我需要自己实现请求的所有解析、答案的格式和对特殊 http 命令的反应(这似乎是一个永无止境的任务):@ 987654322@

【问题讨论】:

这是一个购物问题,用谷歌搜索。 “.net 可嵌入网络服务器”展示了 Nancy、NHttp、Kayak、EmbedIO。 Node.js 是大狗,所以你也想谷歌“node.js .net 集成”。弹出 edge.js 确保在赏金结束前将其写为答案 ;-) REST 和 SOAP 是完全不同的野兽。 REST 是......几乎没有,所以 HttpListener 就足够了。成熟的 SOAP(和 WSDL)很复杂而且有点过时。所以这两个要求在某种程度上是矛盾的。 HttpListener 不需要管理员权限,前提是您所做的事情会暴露您的机器。例如,您想向外部开放您的服务器,还是仅用于 localhost (***.com/questions/223063/…) ?如果您想要的不仅仅是 localhost,则无论如何都需要打开防火墙 @Simon 感谢您的关注。我目前使用 HttpListener 和一个非常简单的 rest api 驱动,并发现问题无处不在。一些消息无效,一些http客户端发送奇怪的http标准消息,如expect continue等。所有这些都不会发生使用像apache这样的标准网络服务器。不幸的是,没有办法将 .net 应用程序和 apache 本机结合起来。然后关于肥皂或休息:这是一个或,我会在我的问题中纠正这个。 @Hans Passant 我真的很想您的评论作为答案。你教我购物问题,这个问题可能为时已晚,但我下次会做得更好。我想一份需求清单是一个好的开始。我喜欢你的 node.js 集成,这可能是我的解决方案。我已经尝试过所有其他人。 【参考方案1】:

你可以试试Griffin web server。我用它来将 Web 服务器嵌入到应用程序中,以托管简单的 Web 界面、文件托管,并为我的应用程序提供 REST API。

与 embedio 项目(非常棒)相比,我最大的优势是它不需要管理员权限即可运行。不过看起来没有开箱即用的 SOAP 集成。

【讨论】:

【参考方案2】:

您应该能够使用.NET Core 做您想做的事。您可以使用它相当轻松地构建一个独立于 IIS 的自托管 API。教程应该很容易找到,here 是微软的例子。

【讨论】:

谢谢!我查找了 .NET Core,但我不确定它是否可以与 .NET 框架结合使用。我需要旧的 .net 框架的解决方案。【参考方案3】:

ilikesleeping 建议您可以使用 dotnet 核心,但将其作为服务工作存在一些复杂性。

我建议你使用Microsoft OWIN 框架。这是构建宁静应用程序的非常简单直接的方式。它可以作为控制台或服务正常工作,当然,在控制台 mkode 中,您可以根据需要显示表单。

以下是一些开始使用的链接: https://docs.microsoft.com/en-us/aspnet/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api | https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/getting-started-with-owin-and-katana | https://blog.decayingcode.com/post/Creating-a-Self-Hosted-OWIN-Application/ | https://weblogs.asp.net/fredriknormen/creating-a-simple-rest-like-service-with-owin-open-web-server-interface

编辑: ...这里是关于如何拥有一个通过 OWIN 托管 SOAP 端点的中间件的主题:Any way to get OWIN to host a SOAP service?

【讨论】:

【参考方案4】:

我是这个问题的作者。只是想让未来的读者明白我在这里学到的东西:

这个问题最有趣的是它是一个“购物”问题。公认的答案不能基于事实,而只能基于主观感觉。大多数建议的方法都符合所描述的用例。

这就是为什么一些用户不想写答案而是将他们的建议放在评论中的原因。奇怪,但这就是 SO 的工作方式。我们只是更喜欢这里的科学正确答案!

顺便说一句,这是我的第一个“赏金”问题。大约 3 周以来,我一直是活跃的 SO 用户。 (像大多数人一样多年来一直处于被动状态)

【讨论】:

以上是关于C# 中 HttpListener 和 Griffin.WebServer 的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

SSL 上的 C# HttpListener 完全失败

使用 C# HttpListener 处理多个请求

C# HttpListener 和 Windows 防火墙

使用 C# HttpListener 提供大文件

如何在 C# 中的随机端口上创建 HttpListener 类?

C# HttpListener Prefixes 不接受 `ws` 阻止 JS WebSocket 连接