В моем приложении 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 выдает только имя файла, что означает, что он добавляется где-то во время процесса из HttpListener
или HttpListenerContext
.
ВсеЭто должно быть сделано с использованием кодировки ASCII.
Я использую подмножество Unity .Net 2.0 с эквивалентной версией среды выполнения .net 3.5