如何使用C# Windows Forms创建简单的本地网页

8

我希望创建一个简单的网页,使用 C# Windows Forms 应用程序或 C# 控制台应用程序。

运行应用程序将开始在以下位置托管网页:

http://localhost:3070/somepage

我已经在MSDN上了解了一些有关使用端点的内容,但由于自学,这对我来说并不是很清楚...简单来说,当程序运行时,它将在localhost:3070上的网页上显示一些文本。很抱歉问题描述得比较含糊,但我搜索了几个小时也没有找到一个理解起来容易的教程...感谢您的时间!

1
HttpListener: http://msdn.microsoft.com/zh-cn/library/system.net.httplistener(v=vs.110).aspx - Simon Whitehead
http://www.asp.net/web-forms - user2930100
1
你的问题是关于asp.net还是Windows Forms?它们完全不同(Windows Forms在你的标题中..这就是为什么我链接到HttpListener的原因..)。 - Simon Whitehead
抱歉,不应该标记为ASP.NET!我不确定当时在想什么。只是针对Windows Forms或C#控制台应用程序,而不是ASP.net。 - JesterBaze
2个回答

9

2020更新:

原始答案在底部。

KestrelKatana现在也是一件事情,我强烈建议您研究这些东西以及OWIN


原始答案:

您需要研究创建HttpListener,您可以向侦听器添加前缀,例如Listener.Prefixes.Add("http://+:3070/"),这将将其绑定到您想要的端口。

一个简单的控制台应用程序:计算请求次数

using System;
using System.Net;
using System.Text;

namespace TestServer
{
    class ServerMain
    {
        // To enable this so that it can be run in a non-administrator account:
        // Open an Administrator command prompt.
        // netsh http add urlacl http://+:8008/ user=Everyone listen=true
        
        const string Prefix = "http://+:3070/";
        static HttpListener Listener = null;
        static int RequestNumber = 0;
        static readonly DateTime StartupDate = DateTime.UtcNow;

        static void Main(string[] args)
        {
            if (!HttpListener.IsSupported)
            {
                Console.WriteLine("HttpListener is not supported on this platform.");
                return;
            }
            using (Listener = new HttpListener())
            {
                Listener.Prefixes.Add(Prefix);
                Listener.Start();
                // Begin waiting for requests.
                Listener.BeginGetContext(GetContextCallback, null);
                Console.WriteLine("Listening. Press Enter to stop.");
                Console.ReadLine();
                Listener.Stop();
            }
        }

        static void GetContextCallback(IAsyncResult ar)
        {
            int req = ++RequestNumber;

            // Get the context
            var context = Listener.EndGetContext(ar);

            // listen for the next request
            Listener.BeginGetContext(GetContextCallback, null);

            // get the request
            var NowTime = DateTime.UtcNow;

            Console.WriteLine("{0}: {1}", NowTime.ToString("R"), context.Request.RawUrl);

            var responseString = string.Format("<html><body>Your request, \"{0}\", was received at {1}.<br/>It is request #{2:N0} since {3}.",
                context.Request.RawUrl, NowTime.ToString("R"), req, StartupDate.ToString("R"));

            byte[] buffer = Encoding.UTF8.GetBytes(responseString);
            // and send it
            var response = context.Response;
            response.ContentType = "text/html";
            response.ContentLength64 = buffer.Length;
            response.StatusCode = 200;
            response.OutputStream.Write(buffer, 0, buffer.Length);
            response.OutputStream.Close();
        }
    }
}

并且有机会的话,请尝试将其添加到您计算机的服务中!

续接@Oxymoron的帖子,为了让监听器打开该端口,应用程序必须具备管理员权限或由执行应用程序的用户允许该IP和端口组合。或者,您可以使用netsh http add urlacl url=http://+:3070/ user="DOMAIN\User"(提示:有一个用户帐户表示所有人)。 - Nico
在代码的注释中添加。感谢@Nico。第9、10、11行。 - Oxymoron
@Oxymoron 这个解决方案对我来说非常有效,_但是_我在尝试修改它时遇到了一些困难... 鉴于问题,这个答案非常好,我的问题是当我尝试端口转发这个页面时,以便可以在任何地方访问它。长话短说,我正在使用HTTP设置串行通信协议,用于我的一些arduino项目。我想能够获取任何串行信息,并使用此网页将其推送在线上。有什么建议吗...?我尝试将const string Prefix = "http://+:3070/";更改为我的IP地址,但没有成功。 - JesterBaze
将“+”符号更改为您的IP地址并不能解决问题,如果您不介意的话,我们可以开始一个新的问题,在那里讨论这个问题。 - Oxymoron

5

微软发布了一个名为OWIN的开源项目,类似于Node,但底线是它允许您在控制台应用程序中托管Web应用程序:

您可以在此处找到更多信息:

但是如果您坚持创建自己的监听器,您可以在这里找到一些帮助:


2
每次我看到“Microsoft”和“开源”在同一个句子中,我都需要重新阅读一遍才能确定。 :> - PTwr
1
我仍然习惯于邪恶的微软将被诅咒的IE6塞到我的面前... 现在看看他们 o_O - PTwr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接