在我的申请中
HttpListener listener
在一个单独的线程上不断地在后台运行。此侦听器用于处理通过本地主机端口请求的文件。并从服务器请求所述文件。
侦听器的设置如下
listener = new HttpListener();
listener.Prefixes.Add("http://+:50003/");
listener.Start();
httpListenerThread = new Thread(RunListener);
httpListenerThread.Start();
它一直活在线上
while (listenerIsRunning)
{
if (listener.IsListening)
{
IAsyncResult result = listener.BeginGetContext(new AsyncCallback(HttpRequestListenerCallback), listener);
result.AsyncWaitHandle.WaitOne(1);
}
}
如果通过HttpListener请求一个文件,我将在回调中获得所请求的文件名,如下所示(其中
result
属于类型
IAsyncResult
object state
):
HttpListener listener = (HttpListener)result.AsyncState;
HttpListenerContext context = listener.EndGetContext(result);
string fileName = context.Request.Url.AbsolutePath.Substring(1);
这在大多数情况下都很有效。返回按预期请求的文件名。但有时(并且不一致地)它会在文件名后面追加104次“%EF%BF%BD”,然后“GP”关闭它。。像这样
%EF%BF%BD%EF%BF%BD。。。。%EF%BF%BD%EF%BF%BDGP“
每次也不会发生在同一个文件上。在新的迭代中可以很好地请求一个文件。
在将文件发送到HttpListener之前检查文件名只会得到文件名,这意味着在
HttpListener
,或
HttpListenerContext
.
一切都是/应该使用ASCII字符集来完成。
我使用Unity的.NET2.0子集和.NET3.5等效的运行时版本