ASP.NET MVC читает необработанные данные в формате JSON

Это сводит меня с ума. Я использую ASP.NET MVC. У меня есть контроллер с действием HttpPost, который действует как URL-адрес обратного вызова, который вызывается другим сервером (не под моим контролем). Я хочу динамически читать опубликованные JSON без использования WebAPI или привязки модели. URL также имеет параметр строки запроса, переданный ему.

URL обратного вызова выглядит примерно так:

http://domain.com/callback?secret=1234

Я попытался прочитать опубликованные данные, используя:

[HttpPost]
public ActionResult Callback( String secret )
{
    String jsonData = new StreamReader(this.Request.InputStream).ReadToEnd();

    // ...
}

Однако "jsonData" всегда является нулевым или пустым.

Я просто хочу получить опубликованные данные и вставить их в JsonFx, чтобы я мог динамически получать доступ к содержимому. Любые идеи о том, как сделать это самым простым способом?

ОБНОВИТЬ

Я обнаружил следующее...

Хотя вышеперечисленное НЕ РАБОТАЕТ (jsonData будет нулевым или пустым), следующее СЛЕДУЕТ, если я настраиваю те небольшие параметры, которые у меня есть на вызывающем сервере, чтобы пропустить параметр "секретной" строки запроса, что почти все, что я могу сделать на это конец, так как это не мой сервер. В этом случае jsonData будет иметь правильную размещенную строку JSON:

[HttpPost]
public ActionResult Callback( /* String secret */ )
{
    String jsonData = new StreamReader(this.Request.InputStream).ReadToEnd();

    // ...
}

Это очень огорчает работу, и я не знаю простого способа принять и строку запроса, и опубликованные данные JSON на стандартном контроллере MVC.

У меня есть "контроллер обратного вызова" с методами Action, которые принимают различные данные (через GET, через форму POST, через JSON POST, через JSON POST со строкой запроса и т. Д.) С разных сторонних серверов. Это обратные вызовы торгового типа, где я не могу контролировать форматы или методы, используемые для передачи информации. Мне просто нужно принять обратные вызовы и обработать информацию, которая должна быть там.

Все это прекрасно работает в моем контроллере, за исключением случая "JSON POST w/ a Query String".

Это кажется (по крайней мере мне) недостатком стандартных контроллеров ASP.NET MVC. ???

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

3 ответа

Решение

Ваш первоначальный подход должен работать, если принять во внимание тот факт, что привязка модели ASP.NET MVC уже прочитала поток, поэтому вам следует перемотать его:

[HttpPost]
public ActionResult Callback(string secret)
{
    Request.InputStream.Seek(0, SeekOrigin.Begin);
    string jsonData = new StreamReader(Request.InputStream).ReadToEnd();

    // ...
}

Сбросить position в Zero перед чтением потока.Request.InputStream.Position = 0

Для ASP.NET Core 2 это работает для меня.

    [HttpPost]
    public ActionResult RawTest() {
        using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
        {  
            string content = reader.ReadToEndAsync().Result;
            //...
        }
        //...
    }
Другие вопросы по тегам