一个Winforms/WPF应用程序能够充当HTTP服务器吗?

4

我有一个使用Winforms编写的桌面应用程序。现在有人想从其他机器访问数据。一开始我考虑使用常规的客户端/服务器应用程序,但现在我认为最好的方法是让应用程序充当HTTP服务器,并向连接的浏览器发送HTML。

有没有人知道是否有可用的库来为应用程序添加HTTP服务器功能?理想情况下,它应该能够提供ASP.NET内容。

5个回答

6
要从您自己的应用程序(无需使用IIS)托管ASP.NET内容(如.aspx页面),请使用System.Web.Hosting命名空间中的类。
其中一个典型的用法是Visual Studio附带的独立测试Web服务器(基于"Cassini")。Cassini的源代码可在此处找到:http://blogs.msdn.com/dmitryr/archive/2008/10/03/cassini-for-framework-3-5.aspx 这是一篇关于此主题的MSDN文章(有点过时):http://msdn.microsoft.com/en-us/magazine/cc188791.aspx 期望您的服务器与IIS一样强大是很难实现的。因此,请务必仔细评估您的需求并管理好您的期望值 :)

谢谢!这太酷了。谁能想到微软会在框架中提供完整的ASP.NET管道呢? - user46703

4

正如Jon所说,您可以使用HttpListener实现HTTP服务器。有关提供ASP.NET内容的内容,请参见System.Web.Hosting命名空间。

需要注意的是,您的设计只在应用程序运行时才可用于HTTP服务器。因此,当桌面应用程序的用户关闭它或注销时,其他人将无法通过您的Web界面访问数据。因此,您可能需要重新考虑您的方法,并将数据访问功能分解为一个单独的DLL,然后可以从托管在IIS上的ASP.NET应用程序中调用它。


3
您可以完全做到这一点。请查看HttpListener。我认为它不太容易托管完整的ASP.NET,虽然我相信有办法可以实现。但发送简单的HTML并不难。
话虽如此,我不确定客户端/服务器模型不是更好的选择:
  • 其他人如何知道连接哪台机器?
  • 如果您意外关闭应用程序,其他人正在使用该应用程序怎么办?
  • 如果您想关闭机器或重新启动它怎么办?
  • 与纯粹的ASP.NET应用程序相比,运行它可能更加复杂。
基本上,所有工具都针对在服务器上托管ASP.NET使其变得更容易。在此处合并客户端和服务器有何好处?

Jon, 你的问题是有意义的。这是一个独特的情况,我希望应用程序看起来像客户端/服务器,但我希望保持开放的选项,以便在不太多的代码更改的情况下迁移到完整的Web应用程序。 当应用程序关闭时客户端无法连接的事实可以被视为这个特定应用程序的“安全功能”。 - user46703
1
@user46703:嗯,我怀疑你会发现这更麻烦而不是有益的。我认为你会发现以这种方式开发存在各种缺点,尤其是在相对不寻常的情况下工具支持方面。 - Jon Skeet
大部分GUI已经借助于jQuery编写完成,并在Web浏览器控件中运行。这有点不寻常,但我要显示的内容非常适合HTML和CSS。 我可以通过自制的HTTP服务器控制内容,所以不会有坏的惊喜。 我认为这会奏效。 - user46703

1

你可以考虑将 HttpListener 代码分离出来,开发一个 Windows 服务,在计算机启动时启动该服务。这将允许您长时间地提供 HTML,而无需始终运行桌面应用程序,也无需获取像 IIS 这样的 Web 服务器。

如果您想与更广泛的客户端进行通信,而不仅仅是浏览器,请研究 WCF。使用 WCF,服务可以由任何 .NET 应用程序托管;例如 Winforms、WPF、Windows 服务、ASP.NET、控制台等,并允许在 HTTP、TCP、命名管道等各种介质上进行通信。


0
我建议采用不同的方法:将您的桌面应用程序更改为与商业数据库服务器(如SQL Server Express)通信,然后构建您的网站以与该数据库进行通信。

如果用户有一堆包含从数据中提取信息所需逻辑的.aspx页面怎么办?这可能是问题的原因:尽可能重用现有代码。 - Jason Kresowaty
是的,我想要重用我的代码。我的本地应用程序大部分使用WebBrowser控件进行GUI,并且大量使用jQuery。 借助System.Web.Hosting的帮助,我应该能够在我的桌面应用程序和完整的Web应用程序之间共享不仅数据库代码,而且甚至是大部分GUI代码。 - user46703
如果您的大部分业务逻辑都在 WebBrowser 控件的页面中,那么可以忽略此建议。但是我看到了您的 WinForms 标签,这通常意味着业务逻辑在应用程序中,这通常意味着需要重新实现很多内容。 - Joel Coehoorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接