C# 如何从HttpListener服务相关文件
我正在学习C# 如何从HttpListener服务相关文件,c#,html,httplistener,C#,Html,Httplistener,我正在学习HttpListener。我正在使用HttpListener(如下所示)创建一个小应用程序,它是一个Web服务器 及)。注意,没有ASP.NET内容 在从\u responderMethod调用的函数中,我基本上返回HTML(从磁盘上的物理文件读取),其中包含以下内容: ... <link href="css/ui-lightness/jquery-ui-1.10.4.custom.css" rel="stylesheet"> <script src
HttpListener
。我正在使用HttpListener
(如下所示)创建一个小应用程序,它是一个Web服务器
及)。注意,没有ASP.NET内容
在从\u 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>
...
类构造函数几乎是:
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) { }
我的SendResponse()
:
如果HTML指定站点上的脚本或CSS文件,客户端浏览器将请求它们。您的服务器也必须提供这些文件。脚本和CSS文件是文本文件,您提供这些文件的方式与提供HTML文件的方式大致相同,不过您需要确保相应地更改内容类型标题。您以二进制格式提供二进制文件(图像等)。同样,您需要确保将内容类型设置为指示它是图像。我编辑了您的问题。与普通论坛网站不同,我们不需要在问题标题中添加标签,也不需要在问题中添加诸如
hi
或thanking
之类的称呼。您能在问题中添加代码,向听众展示方法吗?它将使用HttpListener.Start方法调用。客户端将向服务器请求这些文件。您是否看到客户端(我假设它是一个浏览器)对.css和.js文件的请求?如果是的话,你在为他们服务吗?当您提供HTML时,您将什么设置为响应内容类型?嘿,亚当,吉姆,非常感谢您的帮助。我现在用更多的代码更新了我的帖子@JimMischel客户端是一个浏览器,让我检查一下我是否收到了这些文件的请求…我想我没有收到这些请求…实际上,我正在request.m_RawUrl中获得请求的文件!我不知道为什么我在发布之前没有检查。现在是为他们服务的问题。与File.ReadAllText(如果是text)和File.ReadAllBytes(如果是PNG文件的二进制文件)一样,首选的方法是什么?嗨,吉姆,谢谢,我已经成功了。正如您所提到的,我需要返回内容类型,并从文件中以字节[]的形式返回数据。ReadAllBytes,谢谢!
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) { }
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
});
}
public string SendResponse(HttpListenerRequest request)
{
return File.ReadAllText(@"static\index.html");
}