ПРИМЕЧАНИЕ. Это не приложение Python, это C#.
Я создал приложение C#, которое я пытаюсь превратить в простой сервер, используя этот простой модуль C# Я нашел в Интернете:
https://gist.github.com/aksakalli/9191056
У меня все подключено, но когда я обращаюсь к своему серверу из браузера, он никогда не получает ответа. Я проверил это, используя вкладку Сеть в отладчике Chrome. Я вижу сделанный запрос, но подпанель «Ответ» всегда пуста.
Я отследил код своего сервера, и он работает без ошибок, но после добавления заголовков в ответ и закрытия выходного потока ничего не происходит на стороне браузера. Ниже приведены релевантные части моего кода. Может ли кто-нибудь сказать мне, почему мой браузер никогда не отвечает и как это исправить?
public delegate Task<string> ProcessHttpContext(HttpListenerContext context);
private ProcessHttpContext _processHttpContextFunc = null;
public SimpleHTTPServer(string path, int port, ProcessHttpContext processHttpContextFunc)
{
this.Initialize(path, port);
this._processHttpContextFunc = processHttpContextFunc;
}
public SimpleHTTPServer(string path)
{
//get an empty port
TcpListener l = new TcpListener(IPAddress.Loopback, 0);
l.Start();
int port = ((IPEndPoint)l.LocalEndpoint).Port;
l.Stop();
this.Initialize(path, port);
}
public void Stop()
{
_serverThread.Abort();
_listener.Stop();
}
private void Listen()
{
_listener = new HttpListener();
_listener.Prefixes.Add("http://+:" + _port.ToString() + "/main-page/");
_listener.Start();
while (true)
{
try
{
HttpListenerContext context = _listener.GetContext();
Process(context);
}
catch (Exception ex)
{
Debug.WriteLine("Exception occurred during GetContext() call: " + ex.Message);
if (ex.InnerException != null)
Debug.WriteLine(" Inner Exception: " + ex.InnerException.Message);
}
}
}
async private void Process(HttpListenerContext context)
{
if (context == null)
throw new ArgumentNullException("The context parameter is empty.");
try
{
// Call it with the current context.
string strResult = await this._processHttpContextFunc(context);
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strResult);
context.Response.AddHeader("Content-Type", "text/plain; charset=UTF-8");
context.Response.AddHeader("Content-Length", strResult.Length.ToString());
context.Response.SendChunked = false;
context.Response.StatusCode = (int)HttpStatusCode.OK;
context.Response.StatusDescription = "OK";
context.Response.OutputStream.Write(bytes, 0, bytes.Length);
context.Response.OutputStream.Flush();
}
}
catch (Exception ex)
{
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
}
context.Response.OutputStream.Close();
}
private void Initialize(string path, int port)
{
this._rootDirectory = path;
this._port = port;
_serverThread = new Thread(this.Listen);
_serverThread.Start();
}