2011-08-10 10 views
8

शामिल है, मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जो HTTP POSTs प्राप्त करेगी जिसमें XML डेटा हो। मैं HTTP पोस्ट प्राप्त करने के लिए एचटीपी लिस्टनर स्थापित करने जा रहा हूं और फिर एसीके के साथ प्रतिक्रिया करता हूं।HTTP पोस्ट प्राप्त करने के लिए HttpListener का उपयोग कैसे करें जिसमें XML

मुझे आश्चर्य है कि क्या ऐसे उदाहरण हैं जो समान कार्यक्षमता को लागू करते हैं? और HttpListener एक ही समय में कितने अनुरोध संभाल सकता है?

मेरे पास क्लाइंट से अनुरोधों को संग्रहीत करने के लिए एक संदेश कतार होगी। और मुझे परीक्षण उद्देश्यों के लिए HttpListener को अनुरोध भेजने के लिए एक परीक्षण क्लाइंट स्थापित करना होगा। क्या मुझे HttpListener का परीक्षण करने के लिए WebRequest या कुछ और सेट अप करना चाहिए?

उत्तर

11

आप आने वाले HTTP POSTs को संसाधित करने के लिए HttpListener का उपयोग कर सकते हैं, तो आप श्रोता के लिए जो भी ट्यूटोरियल ढूंढते हैं उसका बहुत अधिक अनुसरण कर सकते हैं। यहाँ कैसे मैं इसे कर रहा हूँ है (एक समय में 1 से अधिक अनुरोध को पूरा करने ध्यान दें कि यह syncronous है, आप धागे या कम से कम async तरीकों का उपयोग करना चाहते हैं।)

public void RunServer() 
{ 
    var prefix = "http://*:4333/"; 
    HttpListener listener = new HttpListener(); 
    listener.Prefixes.Add(prefix); 
    try 
    { 
     listener.Start(); 
    } 
    catch (HttpListenerException hlex) 
    { 
     return; 
    } 
    while (listener.IsListening) 
    { 
     var context = listener.GetContext(); 
     ProcessRequest(context); 
    } 
    listener.Close(); 
} 

private void ProcessRequest(HttpListenerContext context) 
{ 
    // Get the data from the HTTP stream 
    var body = new StreamReader(context.Request.InputStream).ReadToEnd(); 

    byte[] b = Encoding.UTF8.GetBytes("ACK"); 
    context.Response.StatusCode = 200; 
    context.Response.KeepAlive = false; 
    context.Response.ContentLength64 = b.Length; 

    var output = context.Response.OutputStream; 
    output.Write(b, 0, b.Length); 
    context.Response.Close(); 
} 

मुख्य बात यह है कि हो जाता है अनुरोध से एक्सएमएल यह लाइन है:

var body = new StreamReader(context.Request.InputStream).ReadToEnd(); 

यह आपको HTTP अनुरोध का शरीर देता है, जिसमें आपका एक्सएमएल होना चाहिए। आप शायद इसे सीधे किसी भी XML लाइब्रेरी में भेज सकते हैं जो स्ट्रीम से पढ़ सकता है, लेकिन अपवादों के लिए देखना सुनिश्चित करें यदि एक भयानक HTTP अनुरोध भी आपके सर्वर पर भेजा जाता है।