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