MVC Post Raw body - PullRequest
       3

MVC Post Raw body

0 голосов
/ 28 января 2020

Мы используем amp- html и amp-согласие на получение согласия на готовку ie на нашем сайте. У этого параметра есть настройка, в которой вы можете указать конечную точку для onUpdateHref

. Я вижу, что этот запрос выполняется на вкладке сети, и что имеется полезная нагрузка запроса.

{"consentInstanceId":"my-consent","ampUserId":"amp-xxxx","consentState":true,"consentStateValue":"accepted"}

Я пытаюсь определить сигнатуру метода действия MVC для получения этого запроса. Я попытался добавить это как отдельные свойства в методе:

[HttpPost]
public ActionResult updateconsent(string consentInstanceId, string ampUserId, bool consentState, string consentStateValue)
{
}

Или создать определение класса:

public class updateConsentObj
{
    string consentInstanceId { get; set; }
    string ampUserId { get; set; }
    public bool consentState { get; set; }
    public string consentStateValue { get; set; }
}

И передать это как свойство:

public ActionResult updateconsent(updateConsentObj obj)
{
}

Я также попытался добавить FromBody к подписи:

public ActionResult updateconsent([System.Web.Http.FromBody]updateConsentObj obj)
{
}

Все, что я пробую, приводит к нулевым значениям.

Единственный способ прочитать данные полезной нагрузки - это следующее:

Stream req = Request.InputStream;
req.Seek(0, System.IO.SeekOrigin.Begin);
string json = new StreamReader(req).ReadToEnd();

enter image description here

Ответы [ 2 ]

1 голос
/ 28 января 2020

Есть несколько вещей, которые нужно сделать или проверить:

(1) Сделать все свойства public в вашем class updateConsentObj.

(2) Убедитесь, что ваш POST-запрос содержит заголовок, который говорит Content-Type: application/json, это говорит MVC использовать JSON синтаксический анализатор.

( 3) В JSON, который вы разместили, отсутствует ", это должно быть {"consentInstanceId":"my-consent","ampUserId":"amp-xxxx","consentState":true,"consentStateValue":"accepted"}

С учетом всего вышесказанного мне удалось сделать успешный звонок на оба типа метода действия. Ниже приведен код, который я использовал, и результаты.

Использование класса:

[HttpPost]
public ActionResult updateconsent([System.Web.Http.FromBody]updateConsentObj obj)
{
    return Content(
        "OK: " +
        "obj.consentInstanceId = [" + (obj.consentInstanceId ?? "(null)") + "], " +
        "obj.ampUserId = [" + (obj.ampUserId ?? "(null)") + "], " +
        "obj.consentState = [" + obj.consentState + "], " +
        "obj.consentStateValue = [" + (obj.consentStateValue ?? "(null)") + "]");
}

Это дает

OK: obj .consentInstanceId = [мое согласие], obj.ampUserId = [amp-xxxx], obj.consentState = [True], obj.consentStateValue = [принято]

Использование отдельных параметров:

[HttpPost]
public ActionResult updateconsent(string consentInstanceId, string ampUserId, bool consentState, string consentStateValue)
{
    return Content(
        "OK: " +
        "consentInstanceId = [" + (consentInstanceId ?? "(null)") + "], " +
        "ampUserId = [" + (ampUserId ?? "(null)") + "], " +
        "consentState = [" + consentState + "], " +
        "consentStateValue = [" + (consentStateValue ?? "(null)") + "]");
}

Это приводит к

OK: acceptInstanceId = [мое-согласие], ampUserId = [amp-xxxx], acceptState = [True], acceptStateValue = [ принято]

0 голосов
/ 28 января 2020

Добавьте атрибут [ValidateInput(false)] к вашему действию.

Это произошло потому, что. NET обнаружил во введенном тексте что-то похожее на оператор HTML. Поэтому, чтобы отключить проверку запроса, вы должны добавить в действие атрибут [ValidateInput(false)].

Например:

Если ваша модель должна быть такой, как показано ниже:

public class updateConsentObj
{
    public string consentInstanceId { get; set; }
    public string ampUserId { get; set; }
    public bool consentState { get; set; }
    public string consentStateValue { get; set; }
}

, Ваше действие должно быть таким, как показано ниже:

[HttpPost]
[ValidateInput(false)]
public ActionResult updateconsent(updateConsentObj obj)
{
}
...