2010-04-29 9 views
5

Desidero utilizzare ASP per la generazione del codice in un'applicazione desktop C#.Ricezione di dati POST in ASP.NET

Per ottenere ciò, ho impostato un host semplice (derivato da System.MarshalByRefObject) che elabora System.Web.Hosting.SimpleWorkerRequest tramite HttpRuntime.ProcessRequest. Questo elabora lo script ASPX specificato dalla richiesta in entrata (utilizzando System.Net.HttpListener per attendere le richieste).

La parte client è rappresentata da System.ComponentModel.BackgroundWorker che crea System.Net.HttpWebRequest e riceve la risposta dal server.

Una versione semplificata del mio cliente-parte-codice simile a questo:

 
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); 
     } 
    } 
} 

Il mio server-parte-codice simile a questo (senza gestione delle eccezioni, ecc):

 
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(); 
    } 
} 

Finora tutto questo funziona bene finché utilizzo solo i parametri GET. Ma quando si tratta di ricevere dati POST nel mio script ASPX mi imbatto in problemi. Per il test Io uso il seguente script:

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

Sembra che l'oggetto System.Web.HttpRequest ho a che fare in ASP non contiene alcuna informazione circa la mia parametro POST "post-test". L'ho controllato in modalità debug e nessuno dei membri conteneva né il nome-parametro "postTest" né il valore-parametro "654". Ho anche provato il metodo di richiesta BinaryRead, ma sfortunatamente è vuoto. Corrisponde a Request.InputStream == null e Request.ContentLength == 0. E per rendere le cose davvero confuse, il membro Request.HttpMethod è impostato su "GET" ?!

Per isolare il problema, ho testato il codice utilizzando uno script PHP anziché lo script ASPX. Questo è molto semplice:

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

E il risultato è:

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

Quindi, con lo script PHP funziona, posso accedere ai dati POST. Perché lo script ASPX non lo fa? Cosa sto sbagliando? C'è un accessorio o un metodo speciale nell'oggetto Response?

Qualcuno può dare un suggerimento o addirittura sapere come risolvere questo? Grazie in anticipo.

+0

Hai appena provato a utilizzare ["postTest"]? È possibile che solo perché si tratta di un post non può essere caricato in Request.Form. –

risposta

0

Questo potrebbe essere un problema di codifica che comporta il rifiuto del flusso della richiesta. È necessario utilizzare:

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

come probabilmente si invierà la richiesta utilizzando la codepage "Windows-1252".

0

Rimuovere cookieless="true" da Web.config.