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;
//...
}
//...
}