C# WebApi 通过 body 从 C# MVC 接收 json

Posted

技术标签:

【中文标题】C# WebApi 通过 body 从 C# MVC 接收 json【英文标题】:C# WebApi receive json from C# MVC through body 【发布时间】:2018-02-12 13:02:32 【问题描述】:

我正在尝试让我的 C# MVC 将模型作为 JSON x-www-form-urlencoded 获取的数据发送到我的 web api,如果我从邮递员发布到 web api 它会工作,但我无法让它发送它通过 MVC 控制器。

我正在尝试这样做:

控制器:

public ActionResult Update(Models.CaseModel caseModel, int id)

    string date = caseModel.DOB.ToString("dd-MM-yyyy");
    string url = "http://10.0.2.31/testwebapi/api/case/UpdateCasePersonal/";

    var json = new javascriptSerializer().Serialize(caseModel);

    WebClient wc = new WebClient();

    var data = wc.UploadString(url, json);

    return Redirect(Url.Content("~/Case/Personal/" + id));

模型类:

public class CaseModel

    public int Caseid  get; set; 
    public string Title  get; set; 
    public string Forename  get; set; 
    public string Surname  get; set; 
    public string Postcode  get; set; 
    public string Telephone  get; set; 
    public string Email  get; set; 
    [DisplayFormat( ApplyFormatInEditMode = true, DataFormatString = "0:dd'-'MM'-'yyyy")]
    public DateTime DOB  get; set; 
    public string Mobile  get; set; 
    public string MaritalStatus  get; set; 
    public string LoanPurpose  get; set; 

C# Web API:

[HttpPost]
[Route("UpdateCasePersonal/")]
public object UpdateCasePersonal([FromBody] PersonalModel personal)

    using (SqlConnection con = new SqlConnection(conString))
    
        con.Open();

        var query = $@"UPDATE TestDB.dbo.[crm-data] SET Title=@Title, Forename=@Forename, Surname=@Surname, Telephone=@Telephone, Email=@Email, Mobile=@Mobile, DOB=@DOB, LoanPurpose=@Purpose, MaritalStatus=@Marital WHERE Caseid=" + personal.CaseID;

        using (SqlCommand cmd = new SqlCommand(query, con))
        
            cmd.Parameters.Add("@Title", SqlDbType.NVarChar, 50).Value = personal.Title;
            cmd.Parameters.Add("@Forename", SqlDbType.NVarChar, 50).Value = personal.Forename;
            cmd.Parameters.Add("@Surname", SqlDbType.NVarChar, 50).Value = personal.Surname;
            cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 50).Value = personal.Email;
            cmd.Parameters.Add("@Telephone", SqlDbType.NVarChar, 50).Value = personal.Telephone;
            cmd.Parameters.Add("@Mobile", SqlDbType.NVarChar, 50).Value = personal.Mobile;
            cmd.Parameters.Add("@DOB", SqlDbType.Date, 50).Value = personal.DOB;
            cmd.Parameters.Add("@Purpose", SqlDbType.NVarChar, 50).Value = personal.LoanPurpose;
            cmd.Parameters.Add("@Marital", SqlDbType.NVarChar, 50).Value = personal.Marital;

            cmd.CommandType = CommandType.Text;

            var dtb = new DataTable();
            var da = new SqlDataAdapter(cmd);
            da.Fill(dtb);

            return "Updated";
        
    

C# Web API 模型:

public class PersonalModel

    [JsonProperty("CaseID")]
    public string CaseID  get; set; 
    [JsonProperty("Title")]
    public string Title  get; set; 
    [JsonProperty("Forename")]
    public string Forename  get; set; 
    [JsonProperty("Surname")]
    public string Surname  get; set; 
    [JsonProperty("Postcode")]
    public string Postcode  get; set; 
    [JsonProperty("Telephone")]
    public string Telephone  get; set; 
    [JsonProperty("Email")]
    public string Email  get; set; 
    [JsonProperty("DOB")]
    public string DOB  get; set; 
    [JsonProperty("Mobile")]
    public string Mobile  get; set; 
    [JsonProperty("Marital")]
    public string Marital  get; set; 
    [JsonProperty("LoanPurpose")]
    public string LoanPurpose  get; set; 

我不断收到错误

远程服务器返回错误:(415) Unsupported Media Type.

为什么会这样,我该如何解决?

【问题讨论】:

使用 Postman 中的“代码”按钮获取它正在使用的确切 HTTP 代码并将其粘贴到您的问题中。 【参考方案1】:

您似乎没有在您的WebClient 上设置Content-Type 标头。

wc.Headers.Add("Content-Type","x-www-form-urlencoded");

【讨论】:

远程服务器返回错误:(415) 不支持的媒体类型。我现在得到的错误是什么。 var data = wc.UploadString(url, json);在这条线上 您在 Postman 中成功提供了哪些其他标头?这些标头应该复制到您的 WebClient 代码中。 内容类型是唯一我认为它必须与我编码 json 的方式有关的类型?但我不确定我的邮递员标题Content-Type:application/x-www-form-urlencoded 它现在说在我的 C# web api 模型中所有的值都是空的并且它不知道它们中的任何一个是什么 为什么要发送 x-www-form-urlencoded 到 api?您是否尝试过将标头设置为 application/json?

以上是关于C# WebApi 通过 body 从 C# MVC 接收 json的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 调用 WebApi 获取异常 HttpRequestException

C# WebApi 中的实时 FLV 流式传输

如何从 C# WebApi 禁用对 MarkLogic 服务器的预检请求

从 Jquery 到 C# Web API 传递和处理英国日期格式

从统一 C# POST json 字符串到 webAPI; HttpClient 还是 UnityWebRequest?

C#通过WebAPI控制器将Excel xls发送到js并将其保存为文件