【问题标题】:Json Object Serialization in .Net MVC using HttpClient.Net MVC 中使用 HttpClient 的 Json 对象序列化
【发布时间】:2020-04-03 20:24:17
【问题描述】:

我正在尝试将我的模型序列化为 Json 以进行 POST 请求,但每次发出请求时,由于非序列化对象,它会给出 400 Bad Request。

public class AppVersionModel
{
    public Project project { get; set; }

    public String active { get; set; }

    public String createdBy { get; set; }

    public String description { get; set; }

    public String name { get; set; }


    public String obfuscatedId { get; set; }

    public String owner { get; set; }



    /*public String AppName { get; set; }
    public String AppVersion { get; set; }
    public int AppId { get; set; }

    public String Description{ get; set; }

    public String DescriptionForApp { get; set; }

    public String DescriptionForVersion { get; set; }

    public String DevPhase { get; set; }

    public String DevStrategy { get; set; }

    public String IssueTemplate { get; set; }

    public String UserName { get; set; }*/

}


public class Project
{
    /*public String createdBy { get; set; }*/
    [JsonIgnore]
    public String description { get; set; }

    [JsonIgnore]
    public String issueTemplateId { get; set; }

    [JsonIgnore]
    public String name { get; set; }
}

控制器如下。

[System.Web.Mvc.HttpPost]
    public ActionResult onboard([FromUri] AppVersionModel appVersionModel)
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("<any url>");
            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}")));
            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Accept.Clear();

            //HTTP POST
            try
            {

                /*string json = JsonConvert.SerializeObject(appVersionModel);*/
                var postTask = client.PostAsJsonAsync<AppVersionModel>("projectVersions",appVersionModel);

                /*var postTask = client.PostAsJsonAsync<AppVersionModel>("appVersionModel", appVersionModel);*/
                postTask.Wait();
                var result = postTask.Result;
                if (result.IsSuccessStatusCode)
                {
                    return RedirectToAction("Home/Index");
                }
                else if (result.StatusCode == System.Net.HttpStatusCode.Unauthorized)
                {
                    ModelState.AddModelError(string.Empty, "Authentication Error. Please contact administrator.");
                    return View(appVersionModel);
                }

                ModelState.AddModelError(string.Empty, "Server Error. Please contact administrator.");
            }
            catch (HttpException ex)
            {
                ModelState.AddModelError(string.Empty, "Exception Occured in Http Request.");

            }


            return View(appVersionModel);


        }

    }

我收到 400 Bad Request Error,我的理解是,作为一种复杂类型的模型对象,即“项目”,因此它没有序列化模型对象,因此请求没有获得所需的请求正文。

任何人都可以在这方面帮助我。

【问题讨论】:

  • 如果您使用 Post,请将 [FromUri] 更改为 [FromBody] 并尝试使用 postman。
  • @FlorimMaxhuni 他在进入自己的控制器时没有问题,他在发送到 api 时遇到问题。
  • @Rezwan 所以你正在使用另一个库来告诉它忽略你项目的道具。在客户端 API 端,它试图拦截您的 json 并将其分解为一个对象,您的忽略正在阻止 API 收到不映射 1:1 的内容。 API 认为您将完全不同的对象传递给它没有映射的端点。将您的模型抽象为一个新的视图模型,以便 api 接收将包含哪些道具,或者您需要将忽略调用调整为仅 json 写入操作
  • 更改为 FromBody 没有帮助
  • 我只是删除了 jsonIgnore 并将其添加为 jsonProperty 但仍然失败@TravisActon

标签: c# asp.net json asp.net-mvc json.net


【解决方案1】:

删除这一行:

client.DefaultRequestHeaders.Accept.Clear();

你应该像这样PostAsync()

var result = await client.PostAsync("projectVersions", 
                    new StringContent(JsonConvert.SerializeObject(appVersionModel,Encoding.UTF8, "application/json");

最终代码为:

    public ActionResult onboard([FromUri] AppVersionModel appVersionModel)
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("<any url>");
            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}")));
            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

            try
            {
                var result = await client.PostAsync("projectVersions",
                    new StringContent(JsonConvert.SerializeObject(appVersionModel, Encoding.UTF8, "application/json");

                if (result.IsSuccessStatusCode)
                {
                    return RedirectToAction("Home/Index");
                }
                else if (result.StatusCode == System.Net.HttpStatusCode.Unauthorized)
                {
                    ModelState.AddModelError(string.Empty, "Authentication Error. Please contact administrator.");
                    return View(appVersionModel);
                }

                ModelState.AddModelError(string.Empty, "Server Error. Please contact administrator.");
            }
            catch (HttpException ex)
            {
                ModelState.AddModelError(string.Empty, "Exception Occured in Http Request.");
            }
        }
        return View(appVersionModel);
    }

【讨论】:

  • 检查修改后的响应
  • 我无法越过这条线。 var result = await client.PostAsync("projectVersions", new System.Net.Http.StringContent(JsonConvert.SerializeObject(appVersionModel), Encoding.UTF8,"application/json"));*/
  • String dummy = "{\"name\":\"john\",\"age\":22,\"class\":\"mca\"}";*/ HttpContent inputContent = new StringContent(JsonConvert.SerializeObject(dummy), Encoding.UTF8, "application/json");我检查了 StringContent 但它仍然返回空对象。
  • 我认为问题出在 StringContent 上,请您在这方面指导我,我想我缺少一些东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
相关资源
最近更新 更多