【问题标题】:Host web UI with executable application?使用可执行应用程序托管 Web UI?
【发布时间】:2016-08-15 04:36:54
【问题描述】:

这可能是一个非常愚蠢的问题,但我花了将近 5 个小时在网络上进行研究,但没有发现可以完全澄清我的疑问。

简而言之,我被要求为可能的雇主开发某些可执行应用程序,作为“技术测试”的一部分。据说他们正在衡量我使用 WCF 的专业知识。我有两天时间来开发这样的应用程序,有关它的所有信息如下:

可交付成果:

                - 一个可执行文件

                               * APP运行时,应该承载一个WCF服务(SERVICE)以及一个

Web 浏览器可访问的 Web UI (UI)。

                               * 通过 UI,用户应该能够添加或删除存储在

中的消息

数据库 (DB)。

                               * UI 还应显示存储在 DB 中的当前消息列表。

                               * 如果对数据库进行了更改,这些更改应显示在 UI 中

无需重新加载页面。

               - 所有项目源代码。

               

补充说明:

  • 只要明确引用现有库,就可以使用它们

现在,我了解到您可以使用控制台应用程序(以及其他选项)托管 WCF Web 服务,并且只要应用程序正在运行,该服务就会处于活动状态。我还知道,任何 Web 应用程序都可以通过添加服务引用、创建其类型的客户端并调用其方法来访问此服务。当他们要求我将所有内容放在一个可执行应用程序中时,我的困惑就开始了:

当 APP 运行时,它应该托管 WCF 服务 (SERVICE) 以及 Web 浏览器可访问的 Web UI (UI)。

这是什么意思??如何使用可执行文件托管 Web UI?我是否应该开发类似 IIS 的东西,同时在 APP 上以某种方式定义 html 和服务器端代码?

我做了一些研究,发现了一个类(HttpListener),它允许你打开一个 http 端口,监听然后通过它发回一些 html。一个非常简单的类。如果这是一个解决方案,我看不出如何实现它。除此之外,我在网上找不到其他任何东西。

如果我无法及时开发解决方案,我将不胜感激。如果我遗漏了一些关于 WCF 或 Web 托管的重要基本概念,我将不胜感激。提前致谢。

【问题讨论】:

    标签: web-services wcf web owin executable


    【解决方案1】:

    您可以使用 OWIN 来“自托管”网络应用程序。

    可以在此处找到概述和更多信息 - http://codeopinion.com/self-host-asp-net-web-api/

    【讨论】:

      【解决方案2】:

      我通过在服务本身中托管 Web UI 解决了这个问题。服务操作可以返回任何内容,甚至是带有 html 的字节流以供浏览器呈现。这是代码。

      [WebGet(BodyStyle = WebMessageBodyStyle.WrappedRequest)]
          public Stream GetUserInterface()
          {
              var appDirectoryName = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
              var htmlFilePath = appDirectoryName + "\\UI.html";
              var buffer = File.ReadAllBytes(htmlFilePath);
              if (WebOperationContext.Current != null)
                  WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
              return new MemoryStream(buffer);
          }
      

      正如您在与可执行文件相同的目录中看到的,我放置了一个 UI.html 文件,该文件包含我所有的 UI html、javascript 和 css。然后我将其转换为字节数组并将其返回给浏览器。

      所以访问 UI 唯一要做的就是运行应用程序,然后浏览到此操作。例如:http://localhost:8080/MyService/GetUserInterface.

      对于我使用 SQlite 的数据库部分,通过这种方式,应用程序变成了一个独立的应用程序,可以安装在 PC 中并立即运行,而无需数据库或 Web 托管。正是测试要求的。

      或者,我在问题中提到的类 (HttpListener) 也可用于托管 Web UI 而不是服务。这是另一种解决方案。

      private static void HostUI()
          {
              while (true)
              {
                  using (var listener = new HttpListener())
                  {
                      listener.Prefixes.Add("http://localhost:7070/");
                      listener.Start();
                      var context = listener.GetContext();
                      var response = context.Response;
      
                      //The .html file will be in the same folder where the .exe is
                      var appDirectoryName = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
                      var htmlFilePath = appDirectoryName + "\\UI.html";
                      var buffer = File.ReadAllBytes(htmlFilePath);
      
                      response.ContentType = "text/html";
                      response.ContentLength64 = buffer.Length;
                      Console.WriteLine(buffer.Length);
                      var output = response.OutputStream;
                      output.Write(buffer, 0, buffer.Length);
                      output.Close();
                      listener.Close();
                  }
              }
          }
      

      之所以使用无限循环,是因为HttpListener类实现只处理一个循环,所以为了能够多次请求UI,你需要这样做。

      然后你可以浏览到http://localhost:7070/,你也会看到用户界面。

      您可以将这段代码放在一个独立的线程中来承载 Web UI 而不会影响主线程。

      【讨论】:

        猜你喜欢
        • 2015-05-07
        • 2019-04-21
        • 2020-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多