Обрабатывать необработанное содержимое HTTP-запроса


Я делаю решение для электронной коммерции в ASP.NET который используетстандартный сервис платежей на веб-сайте PayPal . Вместе с этим я использую сервис, который они предлагают (Передача платежных данных), который отправляет вам информацию о заказе после того, как пользователь завершил платеж. Последнее, что мне нужно сделать, это проанализировать запрос POST от них и сохранить информацию в нем. Содержание HTTP-запроса имеет следующий вид:

Успех
first_name=Jane+Doe
last_name=Smith
payment_status=завершено
payer_email=janedoesmith%40hotmail.com
payment_gross=3,99
mc_currency=USD
изготовленный на заказ=по+С+купить+в+о+редкая+книга+зеленый+яйца+%26+ветчина

В основном я хочу проанализировать эту информацию и сделать что-то значимое, например, отправить ее по электронной почте или сохранить в БД. Мой вопрос заключается в том, каков правильный подход к разбору необработанных HTTP-данных в ASP.NET, а не как выполняется сам синтаксический анализ.

5 7

5 ответов:

Что-то вроде этого помещено в ваше событие 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();

Update: это должно быть сделано в универсальном обработчике (.ashx) файл, чтобы избежать больших накладных расходов от модели страницы. Смотрите эту статью для получения дополнительной информации.ashx файлы

Используйте IHttpHandler и избегайте накладных расходов модели страницы (которые вам не нужны), но используйте запрос.Форма для получения значений, чтобы вам не пришлось самостоятельно разбирать пары значений имен. Просто представьте, что вы в PHP или классическом ASP (или ASP.NET MVC, если уж на то пошло). ;)

Я настоятельно рекомендую сохранять каждый запрос в некоторый файл.

Таким образом, вы всегда можете вернуться к его фактическому содержанию позже. Вы можете поблагодарить меня позже, когда найдете этот враждебный эндиан, кодированный koi-8, [...], что бы это ни было, что поставило в тупик ваш парсер...

Хорошо, если входящие данные в стандартной форме закодированы в почтовом формате, то с помощью запроса.Массив форм даст вам все данные в удобном для обработки виде.

Если нет, то я не вижу другого способа, кроме использования запроса.Входной поток.

Если я правильно понял ваш вопрос, я думаю, что вы ищете свойство InputStream в объекте запроса. Имейте в виду, что это поток firehose, поэтому вы не можете сбросить его.