为了账号安全,请及时绑定邮箱和手机立即绑定

无法在 asp.net core mvc 中调用具有 [FromBody] 属性的类参数

无法在 asp.net core mvc 中调用具有 [FromBody] 属性的类参数

C#
牧羊人nacy 2022-01-16 14:47:46
我正在 asp.net core mvc 中开发一个用于在线预订的 API。但是,当我尝试从 API 发布方法添加预订时,我收到错误消息:WebException:远程服务器返回错误:(415)不支持的媒体类型。System.Net.HttpWebRequest.GetResponse()有2个项目:项目一我的 API 操作方法中有一个 [FromBody] 属性的 post 方法。我必须调用此方法并传递预订对象。方法定义是:[HttpPost]public Reservation Post([FromBody] Reservation res) =>repository.AddReservation(new Reservation{    Name = res.Name,    FromLocation = res.FromLocation,    ToLocation = res.ToLocation});项目 2 在项目 2 中,我想调用这个 API 方法。为此,我在视图中创建了一个表单来填写名称,从位置到位置值。然后在控制器上我必须调用 API 方法(如上所示)。控制器代码为:[HttpPost]public IActionResult AddReservation(Reservation reservation){    HttpWebRequest apiRequest = WebRequest.Create("http://localhost:8888/api/Reservation") as HttpWebRequest;        apiRequest.Method = "Post";        string parameters = "Name=" + reservation.Name + "Image=" + reservation.Image + "&FromLocation=" + reservation.FromLocation + "&ToLocation=" + reservation.ToLocation;        byte[] byteArray = Encoding.UTF8.GetBytes(parameters);        apiRequest.ContentType = "application/x-www-form-urlencoded";        apiRequest.ContentLength = byteArray.Length;        // Add the post data to the web request        Stream postStream = apiRequest.GetRequestStream();        postStream.Write(byteArray, 0, byteArray.Length);        postStream.Close();        string apiResponse = "";        using (HttpWebResponse response = apiRequest.GetResponse() as HttpWebResponse)        {            StreamReader reader = new StreamReader(response.GetResponseStream());            apiResponse = reader.ReadToEnd();        }        return RedirectToAction("Index");}我收到错误 - WebException:远程服务器返回错误:(415)不支持的媒体类型。System.Net.HttpWebRequest.GetResponse()但是当我运行 powershell 命令时,它可以工作:PM> Invoke-RestMethod http://localhost:8888/api/Reservation -Method POST -Body (@{Name="Anne"; ToLocation="Meeting Room 4"} | ConvertTo-Json) -ContentType "application/json"请帮忙?
查看完整描述

2 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

在前者中,您将请求正文编码为x-www-form-urlencoded,而在后者中,您将请求正文编码为application/json. 相同的动作不能同时响应两者。由于参数装饰有[FromBody],application/json是您应该使用的参数,这就是 powershell 命令起作用的原因。


如果您确实需要 x-www-form-urlencoded,请删除该[FromBody]属性。如果您确实需要同时支持两者,则需要两条单独的路线:


private Reservation PostCore(Reservation res)

{

    // do something

}


[HttpPost("json")]

public Reservation PostJson([FromBody] Reservation res) => PostCore(res);


[HttpPost("")]

public Reservation PostForm(Reservation res) => PostCore(res);


查看完整回答
反对 回复 2022-01-16
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

您的 POST 代码中有两个问题,首先我在评论中提到,克里斯在他的回答中提到。


第二个是您如何生成请求的正文,使用如下内容:


var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://url");

httpWebRequest.ContentType = "application/json";

httpWebRequest.Method = "POST";


using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))

{

    string json = "{\"user\":\"test\"," +

                  "\"password\":\"bla\"}";


    streamWriter.Write(json);

    streamWriter.Flush();

    streamWriter.Close();

}


var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))

{

    var result = streamReader.ReadToEnd();

}

取自此anwser 的代码


您还可以使用Json.Net序列化您的预订(如果所有字段名称和类型匹配)


查看完整回答
反对 回复 2022-01-16
  • 2 回答
  • 0 关注
  • 473 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信