2010-04-29 98 views
5

我想在C#桌面應用程序中使用ASP進行代碼生成。在ASP.NET中接收POST數據

爲了實現這一點,我設置了一個簡單的主機(從System.MarshalByRefObject派生),通過HttpRuntime.ProcessRequest處理System.Web.Hosting.SimpleWorkerRequest。這將處理傳入請求指定的ASPX腳本(使用System.Net.HttpListener等待請求)。

客戶端部分由構建System.Net.HttpWebRequest並從服務器接收響應的System.ComponentModel.BackgroundWorker表示。

的我的客戶部分代碼的簡化版本是這樣的:

 
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參數,所有這些都可以正常工作。但是當涉及到在我的ASPX腳本中接收POST數據時,我遇到了麻煩。爲了測試我使用下面的腳本:

 
// 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: " 

看來,我在ASP對付System.Web.HttpRequest對象不包含我的POST參數「後測」的任何信息。我在調試模式下對其進行了檢查,並且沒有一個成員包含參數名稱「postTest」和參數值「654」。我也嘗試了Request的BinaryRead方法,但不幸的是它是空的。這對應於Request.InputStream == null和Request.ContentLength == 0。爲了讓事情真的變得混亂,Request.HttpMethod成員被設置爲「GET」?!

要隔離問題,我使用PHP腳本代替ASPX腳本測試了代碼。這是非常簡單的:

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

,其結果是:

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

與PHP腳本它的作品,我可以訪問POST數據左右。爲什麼ASPX腳本不?我在做什麼錯? Response對象中是否有特殊的訪問器或方法?

任何人都可以給出提示,甚至知道如何解決這個問題嗎?提前致謝。

+0

您是否嘗試過使用Request [「postTest」]?這可能只是因爲它是一個帖子,它可能沒有被加載到Request.Form中。 – 2011-01-26 14:56:22

回答

0

這可能是一個編碼問題,導致您的請求流被丟棄。您應該使用:

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

您可能會使用「Windows-1252」代碼頁發送請求。

0

從Web.config中刪除cookieless="true"