Quiero usar ASP para la generación de código en una aplicación de escritorio C#.Recepción de datos POST en ASP.NET
Para lograr esto, configuré un host simple (derivado de System.MarshalByRefObject) que procesa un System.Web.Hosting.SimpleWorkerRequest a través de HttpRuntime.ProcessRequest. Esto procesa el script ASPX especificado por la solicitud entrante (usando System.Net.HttpListener para esperar solicitudes).
La parte cliente está representada por System.ComponentModel.BackgroundWorker que crea System.Net.HttpWebRequest y recibe la respuesta del servidor.
Una versión simplificada de mi cliente-parte-código es el siguiente:
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); } } }
Mi servidor-parte-código es el siguiente (sin control de excepciones, etc.):
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(); } }
Hasta ahora, todo esto funciona bien siempre que solo use los parámetros GET. Pero cuando se trata de recibir datos POST en mi script ASPX me encuentro en problemas. Para la prueba de uso el siguiente 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: "
Parece que el objeto System.Web.HttpRequest que estoy tratando en ASP no contiene ninguna información sobre mi parámetro POSTAL "post-test". Lo inspeccioné en modo de depuración y ninguno de los miembros contenía ni el nombre del parámetro "postTest" ni el valor del parámetro "654". También probé el método de solicitud BinaryRead, pero desafortunadamente está vacío. Esto corresponde a Request.InputStream == null y Request.ContentLength == 0. Y para hacer las cosas realmente confusas, el miembro Request.HttpMethod está configurado como "GET"?
Para aislar el problema, probé el código utilizando un script PHP en lugar del script ASPX. Esto es muy simple:
print_r($_GET); // prints all GET variables print_r($_POST); // prints all POST variables
Y el resultado es:
Array ( [getTest] => 321 ) Array ( [postTest] => 654 )
Así, con el script PHP funciona, puedo acceder a los datos POST. ¿Por qué el script ASPX no? ¿Qué estoy haciendo mal? ¿Hay un acceso o método especial en el objeto de respuesta?
Puede alguien dar una pista o incluso saber cómo resolver esto? Gracias por adelantado.
¿Ha intentado simplemente usar Request ["postTest"]? Es posible que solo porque es una publicación no se cargue en Request.Form. –