Получение данных POST в ASP.NET

Я хочу использовать ASP для генерации кода в настольном приложении C #.

Для этого я установил простой хост (производный от System.MarshalByRefObject), который обрабатывает System.Web.Hosting.SimpleWorkerRequest через HttpRuntime.ProcessRequest. Это обрабатывает сценарий ASPX, указанный входящим запросом (используя System.Net.HttpListener для ожидания запросов).

Клиентская часть представлена ​​System.ComponentModel.BackgroundWorker, который создает 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. Но когда дело доходит до получения данных POST в моем сценарии ASPX, у меня возникают проблемы. Для тестирования я использую следующий скрипт:

// 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, с которым я работаю в ASP, не содержит никакой информации о моем параметре POST "postTest". Я проверил его в режиме отладки, и ни один из членов не содержал ни имени параметра «postTest», ни значения параметра «654». Я также пробовал метод запроса 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 специальный метод доступа или метод?

Может кто подскажет или хоть знает как это решить? Заранее спасибо.


person grast    schedule 29.04.2010    source источник
comment
Вы пытались просто использовать Request [postTest]? Возможно, что это сообщение не загружается в Request.Form.   -  person Joel Etherton    schedule 26.01.2011


Ответы (3)


Это может быть проблема с кодировкой, из-за которой ваш поток запросов отбрасывается. Вам следует использовать:

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

поскольку вы, вероятно, отправите запрос с использованием кодовой страницы "Windows-1252".

person BigMomma    schedule 26.01.2011

Удалите cookieless="true" из Web.config.

person Juliano    schedule 12.06.2012

Сегодня у меня была похожая проблема. В моей конфигурации это было вызвано правилом ПЕРЕЗАПИСИ URL-адресов. Правило перенаправляло все страницы с HTTP на HTTPS, и при перенаправлении данные POST были потеряны. Так что для меня помогла публикация данных по HTTPS вместо HTTP (поскольку тогда правило не применялось).

person Jan Šotola    schedule 12.04.2018