0
我正在創建一個偵聽特定Http請求的Windows服務。我在一個單獨的任務中運行一個httpListener
。當服務停止時,關閉偵聽器實例。但似乎在HTTP listenerContext正在等待進入的請求,併爲聽衆得到關閉,我得到以下錯誤無法訪問處置的對象。對象名稱:'System.Net.HttpListener'
Cannot access a disposed object. Object name: 'System.Net.HttpListener'.
即使我使用一些機制來通知StartListening()
傾聽是停止了,它不會因爲運行在相應的線程執行被阻止在HttpListenerContext context = await _listener.GetContextAsync();
直到一個請求到達。
public void StartListening() {
_listener.Start();
_logger.LogDebug("Http Listening started");
Task.Run(async() => {
while (true) {
try {
if (isOpen == false) {
return 0;
}
HttpListenerContext context = await _listener.GetContextAsync();
HttpListenerRequest request = context.Request;
//processing of the requests url/////
var newUri = request.Url.AbsoluteUri;
_concurrentUrlQueue.Enqueue(newUri);
if (ConcurentUrlQueueChanged != null) ConcurentUrlQueueChanged(this, new EventArgs());
}
catch (Exception e) {
_logger.LogError("Error at get listening context, Message: " + e.Message);
}
}
});
}
public void StopListening() {
isOpen = false;
_logger.LogDebug("Http Listening Stop");
_listener.Close();
}
這是關閉正在偵聽獲取上下文的http偵聽器的合適方法。我使用的代碼如下。 謝謝..
,看一下這個問題https://stackoverflow.com/questions/16946389/stopping-and-restarting-httplistener – Ben
謝謝@Ben,我還沒有看到這篇文章,它提到使用'BeginGetContext( )'和'EndGetContext()',就像我在下面的答案中所做的那樣 –