Обрабатывать необработанное содержимое HTTP-запроса
-
09-06-2019 - |
Вопрос
Я создаю решение для электронной коммерции в ASP.NET, которое использует Стандарт платежей на веб-сайте PayPal Обслуживание.Вместе с тем я пользуюсь услугой, которую они предлагают (Передача платежных данных), который отправляет вам обратно информацию о заказе после того, как пользователь завершил платеж.Последнее, что мне нужно сделать, это проанализировать запрос POST от них и сохранить в нем информацию.Содержимое HTTP-запроса представлено в такой форме :
УСПЕХ
first_name=Джейн+Доу
фамилия=Смит
payment_status=Завершен
payer_email=janedoesmith%40hotmail.com
payment_gross=3,99
mc_currency=доллар США
заказ=Для+покупки+++редкой+книги+Зеленые+Яйца+26%+Ветчина
По сути, я хочу проанализировать эту информацию и сделать что-то значимое, например отправить ее по электронной почте или сохранить в базе данных.Мой вопрос заключается в том, каков правильный подход к анализу необработанных HTTP-данных в ASP.NET, а не как выполняется сам синтаксический анализ.
Решение
Что-то вроде этого размещено в вашем событии onload.
if (Request.RequestType == "POST")
{
using (StreamReader sr = new StreamReader(Request.InputStream))
{
if (sr.ReadLine() == "SUCCESS")
{
/* Do your parsing here */
}
}
}
Имейте в виду, что они могут захотеть какого-то особого ответа на (т.е.;не ваша полная веб-страница), так что вы могли бы сделать что-то подобное после завершения синтаксического анализа.
Response.Clear();
Response.ContentType = "text/plain";
Response.Write("Thanks!");
Response.End();
Обновить:это должно быть сделано в файле универсального обработчика (.ashx), чтобы избежать больших накладных расходов со стороны модели страницы.Проверьте эта статья для получения дополнительной информации о файлах .ashx
Другие советы
Используйте IHttpHandler - обработчик и избегайте накладных расходов модели страницы (которые вам не нужны), но используйте Request.Form для получения значений, чтобы вам не приходилось самостоятельно анализировать пары имя-значение.Просто представьте, что вы работаете на PHP или классическом ASP (или ASP.NET MVC, если уж на то пошло).;)
Я бы настоятельно рекомендовал сохранять каждый запрос в какой-нибудь файл.
Таким образом, вы всегда сможете вернуться к его фактическому содержанию позже.Вы можете поблагодарить меня позже, когда обнаружите, что кодировка с враждебным окончанием koi-8, [...], что бы это ни было, поставило в тупик ваш синтаксический анализатор...
Что ж, если входящие данные представлены в стандартном формате POST, закодированном в форме, то с помощью запроса.Массив форм предоставит вам все данные в удобном для обработки виде.
Если нет, то я не вижу другого способа, кроме использования Request.InputStream.
Если я правильно понял ваш вопрос, я думаю, вы ищете Свойство InputStream на объекте Запроса.Имейте в виду, что это поток из пожарного шланга, поэтому вы не можете сбросить его.