运行 作为 Windows 服务的 .asmx Web 服务

Running a .asmx Web service as a Windows Service

我在这个论坛上提问完全是个新手 - 我希望我问的这个问题是正确的。

我要解决的问题是:我有一个 Visual Studio 2010 项目,用于 Web 服务。执行工作的 class 在“.asmx”文件中定义。 class 继承自 "System.Web.Services.WebService" class。

它 运行 在服务器的 IIS 上很愉快。客户端可以对 Web 服务进行 SOAP 调用,它会处理请求并发送响应。没关系。

问题是我想在无法安装 IIS 的 Windows 7 PC 上 运行。所以我希望它 运行 作为 Windows 服务(如果可能的话)。该服务的唯一 "client" 将是该 PC 上的用户。

换句话说,我希望 运行 我的 .asmx 中的所有代码作为 Windows 服务(如果可能)。

在理想情况下,我将能够重新使用我现有的 .asmx(如果可能),而不必将我的所有代码复制并粘贴到新的 Windows 服务解决方案中。

所以我的目标是找到 运行将 .asmx Web 服务作为 Windows 服务的最新方法。我希望有人能为我指出正确的方向,告诉我如何实现这一目标。

我已经做了很多搜索,看起来这是很有可能的。问题是很多解决方案似乎都有些过时了。或者我的概念比较混乱。

基于“How can I deploy my WCF Service without IIS?”,我看了一些东西。

我最接近的是:“https://msdn.microsoft.com/en-us/library/ms751414.aspx”。然而,在这个例子中,实际工作的 class (计算器)实际上包含在服务本身中。我原以为你可以把它们分开。换句话说,让服务创建来自我的 .asmx 文件的 class 实例。

我遇到的第二个关闭是“https://msdn.microsoft.com/en-us/library/bb332338.aspx#msdnwcfhc_topic4”,但这是 .NET 3.0 和 VS 2005。我也在努力理解如何 link 我现有的 class进入服务。

我遇到的其他解决方案建议添加对 "Microsoft.Web.Services3.dll"、"System.Web.dll" 和 "System.Web.Services.dll" 的引用,尽管有些人似乎认为这被称为 WSE,它在.net 4.0 所以我不应该使用它。

关于我从哪里开始的任何指示?

在理想情况下,您会切换到 WCF,因为它可以轻松自托管、在服务中托管等。并且有很多示例。将代码从 ASMX 迁移到 WCF 非常容易。但这是 3.5,因为 NetFX(WCF、WF 和 WPF 是在 3.5 下发布的)。

使用 ASMX,您需要一台服务器来托管。您可以使用 HttpListener class 创建一个简单的 "server"。对于您的目的而言,这可能足够重。

https://msdn.microsoft.com/en-us/library/system.net.httplistener(v=vs.85).aspx

IIS 现在有一个可托管的核心,它可以与较新版本的 .NET 一起使用,但是如果您无法安装较新的版本并且不得不将客户端计算机保留在 3.0,这可能不是您的最佳选择。

您或许能够挖掘出 Cassini 的旧源代码,它是 Microsoft 的实现,最终成为可托管的网络核心。

早在 2008 年,有人就在 VS 中获取了服务器,这可能是一个选项。请注意,此页面上的版本适用于 VS 2008,即 4.0: http://www.codeproject.com/Articles/23939/Light-IIS-Run-Asp-net-without-IIS

Ultidev 有一个服务器被报告为自托管:http://ultidev.com/download/default.aspx

希望其中一项对您有所帮助。

为了完整起见,以下是我解决此问题的方法:

最后我在客户端 PC 上使用了 运行 IIS,然后继续使用 asmx。

我发现将 asmx 转换为 WCF 非常棘手。准确地说,是asmx中的线程处理(由其他人编写的线程处理),我发现很难转换。为了进一步解释我试图转换的 asmx,它在继承自 "System.Web.Services.WebService" 的 class 中完成了所有工作。因此,它可以创建一个 "Application" 实例,然后用它来进行线程管理。

因此,与其尝试使用 "System.ServiceModel"(这不允许我创建 "Application" 实例)做同样的事情,我认为仅在客户端电脑。我认为这比重新编写相当复杂的 asmx 代码更能节省时间。我知道有点失败。

向大家致以诚挚的问候。