2012-11-12 14 views
8

मैं HttpListener का उपयोग कर रहा हूं और मेरी संदर्भ वस्तु प्राप्त करने के लिए BeginGetContext का उपयोग कर रहा हूं। मैं अपने एचटीपी लिस्टनर को बंद करना चाहता हूं लेकिन अगर मैं श्रोता पर Close करने का प्रयास करता हूं तो मुझे अपवाद मिलता है और यह मेरे प्रोग्राम से बाहर निकलने का कारण बनता है।स्वच्छता से संपर्क करें HttpListener's BeginGetContext विधि

using System; 
using System.Net; 

namespace Sandbox_Console 
{ 
    class Program 
    { 
     public static void Main() 
     { 
      if (!HttpListener.IsSupported) 
      { 
       Console.WriteLine("Windows XP SP2 or Server 2003 is required to use the HttpListener class."); 
       return; 
      } 

      // Create a listener. 
      HttpListener listener = new HttpListener(); 
      listener.Prefixes.Add("http://vwdev.vw.local:8081/BitsTest/"); 
      listener.Start(); 
      Console.WriteLine("Listening..."); 

      listener.BeginGetContext(Context, listener); 
      Console.ReadLine(); 

      listener.Close(); //Exception on this line, but not shown in Visual Studio 
      Console.WriteLine("Stopped Listening..."); //This line is never reached. 
      Console.ReadLine(); 

     } 

     static void Context(IAsyncResult result) 
     { 
      HttpListener listener = (HttpListener)result.AsyncState; 
      HttpListenerContext context = listener.EndGetContext(result); 

      context.Response.Close(); 
      listener.BeginGetContext(Context, listener); 
     } 
    } 
} 

कार्यक्रम listener.Close() तथापि त्रुटि कभी नहीं दृश्य स्टूडियो में दिखाया जाता है पर एक अपवाद फेंकता है, केवल टिप्पणी मैं मिलता है डिबग आउटपुट स्क्रीन में निम्नलिखित:

का एक पहला मौका अपवाद System.dll
प्रोग्राम '[2568] Sandbox Console.vshost.exe: प्रबंधित (v4.0.30319)' कोड 0 (0x0) से बाहर निकला है 'System.ObjectDisposedException' टाइप करें।

मैं

 
Application: Sandbox Console.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.ObjectDisposedException 
Stack: 
    at System.Net.HttpListener.EndGetContext(System.IAsyncResult) 
    at Sandbox_Console.Program.Context(System.IAsyncResult) 
    at System.Net.LazyAsyncResult.Complete(IntPtr) 
    at System.Net.ListenerAsyncResult.WaitCallback(UInt32, UInt32, System.Threading.NativeOverlapped*) 
    at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*) 

मैं क्या करने की आवश्यकता है इसलिए मैं अपने HttpListener सफाई से बंद कर सकते हैं Windows ईवेंट व्यूअर से वास्तविक execption प्राप्त करने में सक्षम था?

+0

तो अपने async 'स्थिर शून्य जोड़ सकते हैं निपटारा संदर्भ 'कभी नहीं बुलाया जाता है? .. कुछ ख़राब हो गया है .. 'ऑब्जेक्ट डिस्प्ले एक्सेप्शन' फेंक दिया जाता है जब आप पहले से निपटने वाले ऑब्जेक्ट का निपटान करने का प्रयास करते हैं। कुछ मुझे बताता है कि आपके श्रोता का प्रारंभिक टूटा हुआ है। –

+0

@ सिमन व्हाइटहेड एएच एएच! जब आप बंद करते हैं तो संदर्भ को आखिरी बार बुलाया जाता है। एक समाधान लिखना। –

उत्तर

13

प्रसंग एक आखिरी बार कहा जाता हो जाता है जब आप बंद कहते हैं, आप को संभाल चाहिए वस्तु अपवाद है कि फेंक दिया हो सकता है

static void Context(IAsyncResult result) 
{ 
    HttpListener listener = (HttpListener)result.AsyncState; 

    try 
    { 
     //If we are not listening this line throws a ObjectDisposedException. 
     HttpListenerContext context = listener.EndGetContext(result); 

     context.Response.Close(); 
     listener.BeginGetContext(Context, listener); 
    } 
    catch (ObjectDisposedException) 
    { 
     //Intentionally not doing anything with the exception. 
    } 
} 
+0

यह टूटा हुआ है क्योंकि यह वैध संदर्भों को खोने का कारण बन सकता है। – usr

+0

आप इसे हल करने की क्या सिफारिश करेंगे? –

+0

मुझे पता है कि एक श्रोता को बंद करने का एकमात्र तरीका अपवाद को पकड़ना और संभालना है ... घृणित एपीआई समस्या। सॉकेट के साथ बस। – usr

0

आप इस लाइन

if (!listener.IsListening) { return; } 
HttpListenerContext context = listener.EndGetContext(ctx); 
+0

दरअसल, यदि आप मेरे उत्तर के संशोधन इतिहास को देखते हैं तो यह वही है जो मेरा कोड करता था और यह इंगित करता है कि ऐसा करने से वैध संदर्भ गुम हो सकते हैं और मैंने अपना जवाब वर्तमान तरीके से अपडेट किया। –

संबंधित मुद्दे