如何在 Windows 服务中托管一个简单的 ASP.NET Web 界面

Posted

技术标签:

【中文标题】如何在 Windows 服务中托管一个简单的 ASP.NET Web 界面【英文标题】:How to host a simple ASP.NET web interface in a Windows Services 【发布时间】:2011-03-15 05:35:19 【问题描述】:

对于在 Windows 和 .NET 操作系统上运行的简单设备,我们需要创建一个简单的配置 Web 界面来控制它。就像你的路由器的配置页面一样,没有比这更复杂的了。

应避免安装 IIS 或任何其他 Web 服务器,我们需要的是在基本的 windows XP 安装 + .NET 上的 windows 服务中的自支持进程。

单声道兼容性是一个优点。

谢谢一百万

【问题讨论】:

【参考方案1】:

实际上最简单的方法是使用内置的 WCF 东西(.Net 3.5)...为此,您为“WCF”服务创建一个接口,其中包含一个或多个返回 Stream 的方法:

[ServiceContract]
public interface IService

    [OperationContract]
    [WebInvoke(UriTemplate = "/*arguments", Method="GET", BodyStyle=WebMessageBodyStyle.Bare)]
    Stream Get(string arguments);

您可以定义多个方法和参数并让 WFC 完成工作,或者如上例所示,将所有内容都放入一个方法中。生成的实现可以访问完整的 Uri 和查询参数,如下所示:

public class ServiceType : IService

    public Stream Get(string arguments)
    
        UriTemplateMatch uriInfo = WebOperationContext.Current.IncomingRequest.UriTemplateMatch;
        WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";

        MemoryStream rawResponse = new MemoryStream();
        TextWriter response = new StreamWriter(rawResponse, Encoding.UTF8);
        response.Write("<html><head><title>Hello</title></head><body>");
        response.Write("<b>Path</b>: 0<br/>", arguments);
        response.Write("<b>RequestUri</b>: 0<br/>", uriInfo.RequestUri);
        response.Write("<b>QueryParameters</b>: 0<br/>", uriInfo.QueryParameters.ToString());
        response.Write("</body></html>");
        response.Flush();

        rawResponse.Position = 0;
        return rawResponse;
    

现在您要做的就是启动 WCF web/http 自托管 ...

static void Main()

    Uri baseAddress = new Uri("http://localhost:8000/");
    WebServiceHost svcHost = new WebServiceHost(typeof(ServiceType));

    ServiceEndpoint svcEndpoint = svcHost.AddServiceEndpoint(typeof(IService),
      new WebHttpBinding(), baseAddress);
    svcEndpoint.Behaviors.Add(new WebHttpBehavior());

    svcHost.Open();
    Console.WriteLine("Press enter to quit...");
    Console.ReadLine();

    svcHost.Close();

注意:要让上述示例在 Vista/Win7 上运行,您需要使用以下命令行授予权限:

netsh http add urlacl url=http://+:8000/ user=DOMAIN\USER

【讨论】:

【参考方案2】:

您可以在自己的进程中托管 ASP.Net 运行时。 Rick Strahl 有一篇关于它的旧文章,名为“Using the ASP.Net Runtime for extending desktop applications with dynamic HTML Scripts”。

它应该适用于 Windows XP、.Net 2.0 及更高版本。如果您将此与@csharptest.net 答案中的 WCF 代码结合使用,您应该能够使用 ASP.Net 页面的强大功能并为其提供端点。

【讨论】:

【参考方案3】:

如果你想要一个简单的解决方案,我建议你试试Kayak。

来自网站:

Kayak HTTP 是一个简单的网络服务器。它 监听连接,创建一个 请求的内存表示, 并允许您轻松生成 回应。它可以在任何 C# 中使用 程序。您的代码将 Kayak 加载到 它的进程空间——而不是相反 周围!

它也适用于单声道。试一试! :)

更新

你也可以试试aspnet serve

【讨论】:

皮划艇是我的解决方案。【参考方案4】:

您可以将UtilDev Cassini 与您的Windows 服务一起使用。它基于内置于 Visual Studio 的原始 MS casini,免费且可再分发。

【讨论】:

【参考方案5】:

如果您使用的是 Windows 7,则可以使用 IIS7 的 Hostable Web Core 功能在您的服务中托管 IIS 的子集,而无需安装 IIS7 本身。

您正在寻找的是嵌入式 Web 服务器。虽然您可以自己编写,但我建议您查看C# WebServer,这是一个用 C# 编写的嵌入式 Web 服务器。

【讨论】:

【参考方案6】:

考虑Cassini 构建或新的Hostable Web Core HWC 之一

【讨论】:

以上是关于如何在 Windows 服务中托管一个简单的 ASP.NET Web 界面的主要内容,如果未能解决你的问题,请参考以下文章

使用单个 Windows 服务托管 4 个不同的 WCF 项目。如何?

如何对 Windows 服务中托管的 wcf 服务进行负载/压力测试?

如何在虚拟机中使用托管在 Windows 服务中的 WCF

我可以在 Windows 服务中托管 WCF 服务吗?

在 Server 2008 上的 Windows 服务中托管 WCF 服务时应该使用啥帐户?

想要将 WCF Web 服务作为 Windows 服务托管,而不是在 IIS 中托管