c# - 在 C# 中以编程方式启动 HTTP 服务器?

标签 c# asp.net

我是 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/

相关文章:

c# - 为什么将 DoEvents 放入循环中会导致 StackOverflow 异常?

c# - 最佳实践 : Converting an application to a service with a schedule

c# - 创建文本文件,将它们压缩到 ZipArchive 中并提供以供下载

c# - 如何在asp.net c#中使用带有聚合函数的数据集

c# - 如何检查一个对象的多个属性是否具有相同的条件?

asp.net - 断点不会被击中

c# - 如何通过 ASP.NET 代码隐藏获取放置在转发器中的 html 文本框的值?

asp.net - 当我尝试添加插入值到 asp.net 详细信息 View 中时,我得到 "Object reference not set to an instance of an object"

asp.net - Textbox.text 不显示代码中更新的文本

c# - 我怎样才能在 excel epplus c# 中换行