【问题标题】:Running a .asmx Web service as a Windows Service将 .asmx Web 服务作为 Windows 服务运行
【发布时间】:2015-05-19 17:40:15
【问题描述】:

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

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

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

问题是我希望它在无法安装 IIS 的 Windows 7 PC 上运行。所以我希望它作为 Windows 服务运行(如果可能的话)。该服务的唯一“客户端”将是该 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”。然而,在这个例子中,实际工作的类(计算器)实际上包含在服务本身中。我原以为你可以把它们分开。换句话说,让服务创建来自我的 .asmx 文件的类的实例。

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

我遇到的其他解决方案建议添加对“Microsoft.Web.Services3.dll”、“System.Web.dll”和“System.Web.Services.dll”的引用,尽管有些人似乎认为这是称为 WSE,它在 .net 4.0 中已更新为 WCF,因此我不应该使用它。

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

【问题讨论】:

标签: c# visual-studio-2010 web-services wcf asmx


【解决方案1】:

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

使用 ASMX,您需要一个服务器来托管。您可以使用 HttpListener 类创建一个简单的“服务器”。对于您的目的,这可能足够重。

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

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

您也许可以挖掘 Cassini 的旧资源,这是 Microsoft 的实现,最终成为可托管的 Web 核心。

早在 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

希望其中一项有所帮助。

【讨论】:

  • 这给了我一些很好的调查途径。我打算从 asmx 迁移到 WCF 路线。我非常感谢人们在发布建议时所付出的建议和努力。我一定会回来完成这篇文章,说明我最终如何解决这个问题。
【解决方案2】:

为了完整起见,我是这样解决这个问题的:

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

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

因此,与其尝试使用“System.ServiceModel”(它不允许我创建“应用程序”实例)来做同样的事情,我认为在客户端 PC 上使用 IIS 会更容易。我认为这比重新编写一个相当复杂的 asmx 更好地利用时间。我知道有点失败主义。

向大家致以诚挚的问候。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多