在我的应用程序中,我在一个单独的线程中不断地在后台运行 HttpListener listener . 此侦听器用于处理通过localhost端口请求的文件 . 并请求来自服务器的文件 .

监听器设置如下

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);

这在大多数情况下都可以正常工作 . 返回按预期方式请求的文件名 . 但偶尔(并且不一致)它会将“%EF%BF%BD”追加到文件名104次,而“GP”将其关闭..看起来像这样

“%EF%BF%BD%EF%BF%BD ....%EF%BF%BD%EF%BF%BDGP”

它不会每次都发生在同一个文件中 . 并且可以在新的迭代中正确地请求它发生的文件 .

在将文件发送到HttpListener之前检查文件的名称只会生成文件名,这意味着它会在 HttpListenerHttpListenerContext 过程中的某个位置添加 .

一切都应该/应该使用ASCII字符集完成 .

我使用Unity的.Net 2.0子集与.net 3.5等效的运行时版本