2010-04-29 11 views
5

में पोस्ट डेटा प्राप्त करना मैं सी # डेस्कटॉप एप्लिकेशन में कोड पीढ़ी के लिए एएसपी का उपयोग करना चाहता हूं।एएसपी.नेट

इसे प्राप्त करने के लिए, मैंने एक सरल होस्ट (सिस्टम.मर्शलब्राइफ ऑब्जेक्ट से व्युत्पन्न) स्थापित किया है जो एक सिस्टम को प्रोसेस करता है। Web.Hosting.SimpleWorkerRequest HttpRuntime.ProcessRequest के माध्यम से। यह आने वाले अनुरोध द्वारा निर्दिष्ट एएसपीएक्स स्क्रिप्ट को संसाधित करता है (अनुरोधों की प्रतीक्षा करने के लिए System.Net.HttpListener का उपयोग करके)।

क्लाइंट-पार्ट का प्रतिनिधित्व सिस्टम द्वारा किया जाता है। कॉम्पोनेंट मॉडेल। बैकग्राउंड वर्कर जो System.Net.HttpWebRequest बनाता है और सर्वर से प्रतिक्रिया प्राप्त करता है।

मेरे मुवक्किल-पार्ट-कोड का एक सरलीकृत संस्करण इस तरह दिखता है:

 
private void SendRequest(object sender, DoWorkEventArgs e) 
{ 
    // create request with GET parameter 
    var uri = "http://localhost:9876/test.aspx?getTest=321"; 
    var request = (HttpWebRequest)WebRequest.Create(uri); 

    // append POST parameter 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 

    var postData = Encoding.Default.GetBytes("postTest=654"); 
    var postDataStream = request.GetRequestStream(); 
    postDataStream.Write(postData, 0, postData.Length); 

    // send request, wait for response and store/print content 
    using (var response = (HttpWebResponse)request.GetResponse()) 
    { 
     using (var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) 
     { 
      _processsedContent = reader.ReadToEnd(); 
      Debug.Print(_processsedContent); 
     } 
    } 
} 

मेरे सर्वर-पार्ट-कोड (अपवाद हैंडलिंग आदि) के बिना इस तरह दिखता है:

 
public void ProcessRequests() 
{ 
    // HttpListener at http://localhost:9876/ 
    var listener = SetupListener(); 

    // SimpleHost created by ApplicationHost.CreateApplicationHost 
    var host = SetupHost(); 

    while (_running) 
    { 
     var context = listener.GetContext(); 

     using (var writer = new StreamWriter(context.Response.OutputStream)) 
     { 
      // process ASP script and send response back to client 
      host.ProcessRequest(GetPage(context), GetQuery(context), writer); 
     } 

     context.Response.Close(); 
    } 
} 

अब तक यह सब ठीक काम करता है जब तक कि मैं केवल पैरामीटर का उपयोग करता हूं। लेकिन जब मेरी एएसपीएक्स स्क्रिप्ट में पोस्ट डेटा प्राप्त करने की बात आती है तो मैं परेशानी में पड़ता हूं। परीक्षण के लिए मैं निम्न स्क्रिप्ट का उपयोग:

 
// GET parameters are working: 
var getTest = Request.QueryString["getTest"]; 
Response.Write("getTest: " + getTest);   // prints "getTest: 321" 

// don't know how to access POST parameters: 
var postTest1 = Request.Form["postTest"];  // Request.Form is empty?! 
Response.Write("postTest1: " + postTest1);  // so this prints "postTest1: " 

var postTest2 = Request.Params["postTest"];  // Request.Params is empty?! 
Response.Write("postTest2: " + postTest2);  // so this prints "postTest2: " 

ऐसा लगता है कि System.Web.HttpRequest वस्तु मैं एएसपी में साथ काम कर रहा हूँ मेरी पोस्ट पैरामीटर "posttest" के बारे में कोई जानकारी नहीं है। मैंने डीबग मोड में इसका निरीक्षण किया और सदस्यों में से कोई भी न तो पैरामीटर-नाम "पोस्टटेस्ट" और पैरामीटर-मान "654" था। मैंने अनुरोध की बाइनरी रीड विधि भी कोशिश की, लेकिन दुर्भाग्य से यह खाली है। यह Request.InputStream == शून्य और Request.ContentLength == 0 से मेल खाता है। और चीजों को वास्तव में अनुरोध को भ्रमित करने के लिए। HttpMethod सदस्य "GET" पर सेट है ?!

समस्या को अलग करने के लिए मैंने एएसपीएक्स स्क्रिप्ट के बजाय PHP स्क्रिप्ट का उपयोग कर कोड का परीक्षण किया। यह बहुत सरल है:

 
print_r($_GET); // prints all GET variables 
print_r($_POST); // prints all POST variables 

और परिणाम है:

 
Array 
(
    [getTest] => 321 
) 
Array 
(
    [postTest] => 654 
) 

PHP स्क्रिप्ट यह काम करता है, मैं पोस्ट डेटा का उपयोग कर सकते हैं के साथ तो। एएसपीएक्स स्क्रिप्ट क्यों नहीं करती है? मैं क्या गलत कर रहा हूँ? क्या प्रतिक्रिया वस्तु में कोई विशेष एक्सेसर या विधि है?

कोई भी संकेत दे सकता है या यहां तक ​​कि इसे हल करने का तरीका भी बता सकता है? अग्रिम में धन्यवाद।

+0

क्या आपने अभी अनुरोध ["पोस्टटेस्ट"] का उपयोग करने का प्रयास किया है? यह संभव है कि सिर्फ इसलिए कि यह एक पोस्ट है, यह Request.Form में लोड नहीं हो रहा है। –

उत्तर

0

यह एक एन्कोडिंग समस्या हो सकती है जिसके परिणामस्वरूप आपकी अनुरोध धारा को त्याग दिया जा सकता है। आपको इसका उपयोग करना चाहिए:

UTF8Encoding.UTF8.GetBytes("postTest=654"); 

जैसा कि आप शायद "विंडोज -1252" कोडपेज का उपयोग कर अनुरोध भेज रहे होंगे।