使用可执行应用程序托管 Web UI?
Host web UI with executable application?
这可能是一个非常愚蠢的问题,但我已经花了将近 5 个小时在网上进行研究,但没有找到任何可以完全澄清我的疑问的东西。
简而言之,我被要求寻找一个可能的雇主来开发某些可执行应用程序作为 "Technical Test" 的一部分。据说他们正在衡量我使用 WCF 的专业知识。给了我两天的时间来开发这样的应用程序,有关它的所有信息如下:
Deliverable:
- An executable that
* When APP is ran, it should host a WCF service (SERVICE) as well as a
web UI (UI) accessible by web browsers.
* Through the UI, user should be able to add or delete messages stored in a
database (DB).
* The UI should also display the current list of messages stored in the DB.
* If changes are made to the DB, those changes should show up in the UI
without the need to reload the page.
- All of the project source code.
Additional notes:
- Use of existing libraries is allowed as long as they are clearly referenced
现在,我知道您可以使用控制台应用程序(以及其他选项)托管 WCF Web 服务,只要应用程序 运行,该服务就会一直存在。我还知道,任何 Web 应用程序都可以通过添加服务引用、创建其类型的客户端并调用其方法来访问该服务。当他们要求我将所有内容放在一个可执行应用程序中时,我开始感到困惑:
When APP is ran, it should host a WCF service (SERVICE) as well as a web UI (UI) accessible by web browsers.
这是什么意思??如何使用可执行文件托管 Web UI?我是否应该开发类似 IIS 的东西,同时以某种方式在 APP 上定义 html 和服务器端代码?
我做了一些研究,我发现了一个 class(HttpListener),它允许你打开一个 http 端口,监听然后通过它发回一些 html。一个很简单的class。如果这是一个解决方案,我看不出如何实施它。除此之外,我在网上找不到任何其他东西。
我将不胜感激对此事的任何意见,即使我无法及时开发解决方案,我也想知道如何去做。如果我遗漏了一些关于 WCF 或虚拟主机的重要基本概念,我将不胜感激一些澄清。提前致谢。
您可以将 OWIN 用于 "self host" 网络应用程序。
可在此处找到概述和更多信息 - http://codeopinion.com/self-host-asp-net-web-api/
我通过在服务本身中托管网络 UI 解决了这个问题。服务操作可以 return 任何东西,甚至是带有 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。然后我将它转换为一个字节数组,并将 return 转换为浏览器。
因此,要访问 UI,我唯一要做的就是 运行 应用程序,然后浏览到此操作。例如:http://localhost:8080/MyService/GetUserInterface.
对于数据库部分,我使用了 SQlite,通过这种方式,应用程序成为一个独立的应用程序,可以安装在 PC 上,并且 运行 无需数据库或 Web 托管即可立即使用。正是测试所要求的。
另外,我在问题 (HttpListener) 中提到的 class 也可用于托管 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 class 实现只处理一个循环顺序,所以为了能够多次请求 UI 你需要这样做.
然后您可以浏览到 http://localhost:7070/,您也会看到 UI。
您可以将此代码放在一个独立的线程中以托管 Web UI,而不影响主线程。
这可能是一个非常愚蠢的问题,但我已经花了将近 5 个小时在网上进行研究,但没有找到任何可以完全澄清我的疑问的东西。
简而言之,我被要求寻找一个可能的雇主来开发某些可执行应用程序作为 "Technical Test" 的一部分。据说他们正在衡量我使用 WCF 的专业知识。给了我两天的时间来开发这样的应用程序,有关它的所有信息如下:
Deliverable:
- An executable that
* When APP is ran, it should host a WCF service (SERVICE) as well as a
web UI (UI) accessible by web browsers.
* Through the UI, user should be able to add or delete messages stored in a
database (DB).
* The UI should also display the current list of messages stored in the DB.
* If changes are made to the DB, those changes should show up in the UI
without the need to reload the page.
- All of the project source code.
Additional notes:
- Use of existing libraries is allowed as long as they are clearly referenced
现在,我知道您可以使用控制台应用程序(以及其他选项)托管 WCF Web 服务,只要应用程序 运行,该服务就会一直存在。我还知道,任何 Web 应用程序都可以通过添加服务引用、创建其类型的客户端并调用其方法来访问该服务。当他们要求我将所有内容放在一个可执行应用程序中时,我开始感到困惑:
When APP is ran, it should host a WCF service (SERVICE) as well as a web UI (UI) accessible by web browsers.
这是什么意思??如何使用可执行文件托管 Web UI?我是否应该开发类似 IIS 的东西,同时以某种方式在 APP 上定义 html 和服务器端代码?
我做了一些研究,我发现了一个 class(HttpListener),它允许你打开一个 http 端口,监听然后通过它发回一些 html。一个很简单的class。如果这是一个解决方案,我看不出如何实施它。除此之外,我在网上找不到任何其他东西。
我将不胜感激对此事的任何意见,即使我无法及时开发解决方案,我也想知道如何去做。如果我遗漏了一些关于 WCF 或虚拟主机的重要基本概念,我将不胜感激一些澄清。提前致谢。
您可以将 OWIN 用于 "self host" 网络应用程序。
可在此处找到概述和更多信息 - http://codeopinion.com/self-host-asp-net-web-api/
我通过在服务本身中托管网络 UI 解决了这个问题。服务操作可以 return 任何东西,甚至是带有 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。然后我将它转换为一个字节数组,并将 return 转换为浏览器。
因此,要访问 UI,我唯一要做的就是 运行 应用程序,然后浏览到此操作。例如:http://localhost:8080/MyService/GetUserInterface.
对于数据库部分,我使用了 SQlite,通过这种方式,应用程序成为一个独立的应用程序,可以安装在 PC 上,并且 运行 无需数据库或 Web 托管即可立即使用。正是测试所要求的。
另外,我在问题 (HttpListener) 中提到的 class 也可用于托管 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 class 实现只处理一个循环顺序,所以为了能够多次请求 UI 你需要这样做.
然后您可以浏览到 http://localhost:7070/,您也会看到 UI。
您可以将此代码放在一个独立的线程中以托管 Web UI,而不影响主线程。