首页 > 解决方案 > MVC 发布原始正文

问题描述

我们在我们的网站上使用 amp-html 和 amp-consent 来管理 cookie 同意。这有一个设置,您可以指定一个端点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();

在此处输入图像描述

标签: asp.net-mvcamp-html

解决方案


有几件事情要做或检查:

(1 )在你.publicclass updateConsentObj

(2)确保您的 POST 请求包含一个标头Content-Type: application/json,它告诉 MVC 使用 JSON 解析器。

(3)您发布的JSON中有一个缺失",应该是{"consentInstanceId":"my-consent","ampUserId":"amp-xxxx","consentState":true,"consentStateValue":"accepted"}

应用上述所有方法后,我能够成功调用这两种类型的 Action Method。有关我使用的代码和结果,请参见下文。

使用一个类:

[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)") + "]");
}

这产生

好的: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:consentInstanceId = [my-consent],ampUserId = [amp-xxxx],consentState = [True],consentStateValue = [接受]


推荐阅读