c# – 如何从HttpListener提供相关文件

我正在学习HttpListener.我正在使用HttpListener创建一个小型应用程序,这是一个Web服务器(如下)

http://msdn.microsoft.com/en-us/library/system.net.httplistener%28v=vs.110%29.aspx
https://www.codehosting.net/blog/BlogEngine/post/Simple-C-Web-Server.aspx).注意,没有ASP.NET的东西.

在我从_responderMethod调用的函数中,我基本上返回HTML(从磁盘上的物理文件中读取),其中包含以下内容:

   ...
   <link href="css/ui-lightness/jquery-ui-1.10.4.custom.css" rel="stylesheet">
   <script src="js/jquery-1.10.2.js"></script>
   <script src="js/jquery-ui-1.10.4.custom.js"></script>
   ...

但是,正如预期的那样,似乎没有提供.css和.js文件(我可以说,因为在提供html之后,客户端上没有预期的样式或行为).

我如何提供这些文件,我需要用HttpServerUtility.MapPath做些什么吗?如果是的话,你能指点我的一些例子吗?

或者我是否需要扫描我即将提供的HTML并打开这些文件(递归地)读取并返回这些文件?我希望不是.

BTW,服务于此的C#代码如下,其中我的_responderMethod只返回HTML文件的字符串,如上所述:

我按如下方式初始化并启动服务器:

WebServer ws = new WebServer(program.SendResponse, "http://<myip>:8080/");
ws.Run();

类构造函数非常多:

public class WebServer
{
    private readonly HttpListener _listener = new HttpListener();
    private readonly Func<HttpListenerRequest, string> _responderMethod;

    public WebServer(string[] prefixes, Func<HttpListenerRequest, string> method)
    { 
        // A responder method is required
        if (method == null)
            throw new ArgumentException("method");

        foreach (string s in prefixes)
            _listener.Prefixes.Add(s);

         _responderMethod = method;
         _listener.Start();
}
public WebServer(Func<HttpListenerRequest, string> method, params string[] prefixes)
    : this(prefixes, method) { }

.Run()是:

public void Run()
{
    ThreadPool.QueueUserWorkItem((o) =>
    {
        Console.WriteLine("Webserver running...");
        try
        {
            while (_listener.IsListening)
            {
                ThreadPool.QueueUserWorkItem((c) =>
                {
                    var ctx = c as HttpListenerContext;
                    try
                    {
                        string rstr = _responderMethod(ctx.Request);
                        byte[] buf = Encoding.UTF8.GetBytes(rstr);
                        ctx.Response.ContentLength64 = buf.Length;
                        ctx.Response.OutputStream.Write(buf, 0, buf.Length);
                    }
                    catch { } // suppress any exceptions
                    finally
                    {
                        // always close the stream
                        ctx.Response.OutputStream.Close();
                    }
                }, _listener.GetContext());
            }
        }
        catch { } // suppress any exceptions
    });
}

我的SendResponse():

public string SendResponse(HttpListenerRequest request)
{
      return File.ReadAllText(@"static\index.html");
}

最佳答案 如果您的HTML指定您站点上的脚本或CSS文件,则客户端浏览器将请求它们.您的服务器也必须提供这些文件.脚本和CSS文件是您提供的文本文件,与提供HTML文件的方式非常相似,但您需要确保相应地更改内容类型标题.您以二进制格式提供二进制文件(图像等).同样,您需要确保设置内容类型以指示它是图像.

点赞