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

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

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

Клиентская часть представлена Системой. ComponentModel. BackgroundWorker, который создает Систему. Сеть. 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();
    }
}

До сих пор все это хорошо работает, пока я просто использую, ПОЛУЧАЮТ параметры. Но когда дело доходит до получения данных 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: "

Кажется что Система. Сеть. HttpRequest возражают, что я имею дело с в ASP, не содержит информации о моем параметре POST "заключительный тест". Я осмотрел его в режиме отладки, и ни один из участников действительно не содержал ни названия параметра "заключительный тест", ни значения параметра "654". Я также попробовал метод BinaryRead Запроса, но к сожалению это пусто. Это соответствует Запросу. InputStream == пустой указатель и Запрос. ContentLength == 0. И сделать вещи, действительно путающие Запрос. Член HttpMethod установлен "ДОБРАТЬСЯ"?!

Для изоляции проблемы, я протестировал код при помощи Сценария 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 делает нет? Что я делаю неправильно? Существует ли специальное средство доступа или метод в объекте Ответа?

Кто-либо может дать подсказку или даже знать, как решить это?Заранее спасибо.

6
задан grast 1 May 2010 в 12:10
поделиться