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

我正在 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"

请帮忙?


牧羊人nacy
浏览 474回答 2
2回答

阿晨1998

在前者中,您将请求正文编码为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);

慕的地8271018

您的 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序列化您的预订(如果所有字段名称和类型匹配)
打开App,查看更多内容
随时随地看视频慕课网APP