【问题标题】:HttpClient {StatusCode: 415, ReasonPhrase: 'Unsupported Media Type'HttpClient {StatusCode:415,ReasonPhrase:'不支持的媒体类型'
【发布时间】:2019-08-23 17:23:02
【问题描述】:

我尝试在一个方法中调用我的 API,但出现错误:{StatusCode: 415, ReasonPhrase: 'Unsupported Media Type'。我一直在环顾四周,发现很多人都有同样的问题,但通过在创建 StringContent 时添加媒体类型已解决。我已经设置了字符串内容,但我仍然得到错误。

这是我尝试调用 API 的方法:

    [HttpGet]
    public async Task<ActionResult> TimeBooked(DateTime date, int startTime, int endTime, int id)
    {

        var bookingTable = new BookingTableEntity
        {
            BookingSystemId = id,
            Date = date,
            StartTime = startTime,
            EndTime = endTime
        };

        await Task.Run(() => AddBooking(bookingTable));

        var url = "http://localhost:60295/api/getsuggestions/";

        using (var client = new HttpClient())
        {
            var content = new StringContent(JsonConvert.SerializeObject(bookingTable), Encoding.UTF8, "application/json");
            var response = await client.GetAsync(string.Format(url, content));
            string result = await response.Content.ReadAsStringAsync();

            var timeBookedModel = JsonConvert.DeserializeObject<TimeBookedModel>(result);

            if (response.IsSuccessStatusCode)
            {
                return View(timeBookedModel);
            }
        }

还有我的 API 方法:

    [HttpGet]
    [Route ("api/getsuggestions/")]
    public async Task<IHttpActionResult> GetSuggestions(BookingTableEntity bookingTable)
    {
        //code
    }

我一直在使用相同的代码来调用我的其他方法,除了这种情况外,它一直运行良好。我不明白它们之间的区别。

这是一个示例,我使用基本相同的代码并且它可以工作。

[HttpGet]
    public async Task<ActionResult> ChoosenCity(string city)
    {
        try
        {
            if (ModelState.IsValid)
            {
                var url = "http://localhost:60295/api/getbookingsystemsfromcity/" + city;

                using (var client = new HttpClient())
                {
                    var content = new StringContent(JsonConvert.SerializeObject(city), Encoding.UTF8, "application/json");
                    var response = await client.GetAsync(string.Format(url, content));
                    string result = await response.Content.ReadAsStringAsync();

                    var bookingSystems = JsonConvert.DeserializeObject<List<BookingSystemEntity>>(result);
                    var sortedList = await SortListByServiceType(bookingSystems);

                    if (response.IsSuccessStatusCode)
                    {
                        return View(sortedList);
                    }
                }
            }
        }

        catch (Exception ex)
        {
            throw ex;
        }

        return RedirectToAction("AllServices");
    }

还有 API:

[HttpGet]
    [Route("api/getbookingsystemsfromcity/{city}")]
    public async Task<IHttpActionResult> GetBookingSystemsFromCity(string city)
    {
        //code
    }

【问题讨论】:

  • GET 请求不能有正文,因此它们也不能有内容类型。看起来服务器一看到无效的标头就拒绝了请求,甚至没有尝试查看是否有正文。

标签: c# asp.net asp.net-web-api


【解决方案1】:

Web API 要求客户端指定 Content-Type 标头,但您不能在发出 GET 请求时为 HttpClient 指定此标头,因为它没有正文。即使您在StringContent 中指定了application/json,您也错误地将对象传递到请求中。考虑使用POST 来解决您的问题。使用POST 传输复杂对象是一种常见的做法。

更新 api 以接受POST

[HttpPost]
[Route ("api/getsuggestions/")]
public async Task<IHttpActionResult> GetSuggestions(BookingTableEntity bookingTable)

更新请求代码

var content = new StringContent(JsonConvert.SerializeObject(city), Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
string result = await response.Content.ReadAsStringAsync();

注意

不要在每个请求中处理 HttpClient,它应该是 reused

【讨论】:

    【解决方案2】:

    您正在将正文发送到没有正文参数的获取请求中。您只能在 url 或查询字符串中传递参数。

    第二次查询成功,因为你在url中传递了城市。

    如果您想在请求正文中传递复杂对象,则需要将第一个查询切换为发布请求,或者将复杂对象分离为参数并在 url 中传递它们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-10
      • 2019-05-01
      • 2017-06-30
      • 2017-07-05
      • 2016-11-26
      • 2015-08-21
      相关资源
      最近更新 更多