У меня есть приложение, которое выполняет запросы к определенному URL через определенные промежутки времени на протяжении всего его выполнения.В целях тестирования я хочу настроить фиктивный сервер с HttpListener
для получения этих запросов и делать что-то каждый раз, когда он получает один.
Когда процесс завершается, я хочу отключить HttpListener
вправильный путь.
Вот что у меня есть:
protected async Task<bool> RunApp()
{
try
{
var startInfo = new ProcessStartInfo
{
FileName = "/some/dir/helloworld.sh",
UseShellExecute = true
};
using (var proc = new Process())
{
proc.StartInfo = startInfo;
proc.Exited += ShutdownServer;
proc.EnableRaisingEvents = true;
proc.Start();
while (!proc.HasExited)
{
var context = await server.GetContextAsync();
await ProcessCallback(context);
}
}
// at this point, the process should be disposed as well
// as the HttpListener to continue with other code execution
return true;
}
catch(Exception ex)
{
//Log it
}
}
private void ShutdownServer(object sender, EventArgs args)
{
server.Stop();
server.Close();
}
private async Task ProcessCallback(HttpListenerContext context)
{
// do some stuff
}
Но когда процесс завершается, я получаю следующее исключение:
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'listener'.
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Net.ListenerAsyncResult.GetContext()
at System.Net.HttpListener.EndGetContext(IAsyncResult asyncResult)
at System.Net.HttpListener.<>c.<GetContextAsync>b__44_1(IAsyncResult iar)
Что происходит из:
var context = await server.GetContextAsync();
В этой ситуации используется CancellationToken
?Если нет, то как правильно отключить HttpListener
?