Я хочу использовать 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 специальный метод доступа или метод?
Может кто-нибудь дать подсказку или хотя бы знает, как это решить? Заранее спасибо.