我是 C#、ASP.NET 新手。
假设我有一个现有的 C# 项目(来自“控制台应用程序”模板;我使用 Visual Studio)。我希望能够启动一个简单的 HTTP 服务器并提供 .aspx 页面(甚至是普通文本,在这种情况下我也在寻找一个不错的模板库 ^^),但仅当一个通过命令行界面向程序提供某些命令。 (因此,默认情况下服务器未启动。)
我怎样才能最好地做到这一点?
非常感谢您的帮助!
编辑:澄清一下,我希望所有这些功能都嵌入到一个非网络应用程序非网站项目中。也就是说,该项目由三部分组成:命令行界面、可选运行的 Web 界面(HTTP 服务器)以及等待和响应请求的核心那两个接口(interface)。这是现有项目的当前状态,没有网络界面。
最佳答案
您可以在控制台应用程序中托管 ASP.NET 运行时。这是一个例子:
public class SimpleHost : MarshalByRefObject
{
public void ProcessRequest(string page, string query, TextWriter writer)
{
SimpleWorkerRequest swr = new SimpleWorkerRequest(page, query, writer);
HttpRuntime.ProcessRequest(swr);
}
}
class Program
{
static void Main(string[] args)
{
// TODO: Check to see if a given argument has been passed on the command-line
SimpleHost host = (SimpleHost)ApplicationHost.CreateApplicationHost(
typeof(SimpleHost), "/", Directory.GetCurrentDirectory());
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://localhost:9999/");
listener.Start();
Console.WriteLine("Listening for requests on http://localhost:9999/");
while (true)
{
HttpListenerContext context = listener.GetContext();
string page = context.Request.Url.LocalPath.Replace("/", "");
string query = context.Request.Url.Query.Replace("?", "");
using (var writer = new StreamWriter(context.Response.OutputStream))
{
host.ProcessRequest(page, query, writer);
}
context.Response.Close();
}
}
}
当您运行这个程序时,您可能会得到一个TypeLoadException
。您必须为当前目录创建一个 bin
子目录,并将可执行文件的副本移动到其中。这是因为 ASP.NET 运行时将查找 bin 子目录。另一种选择是将 SimpleHost
放入您部署到 GAC 中的单独程序集中。
关于c# - 在 C# 中以编程方式启动 HTTP 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1651406/