当前位置: 首页 > 知识库问答 >
问题:

调用Web API 2endpoint时出现HTTP 415不支持的媒体类型错误

黄扬
2023-03-14

我有一个现有的网络应用编程接口2服务,需要修改其中一个方法,以将自定义对象作为另一个参数,目前该方法有一个参数,这是一个来自网址的简单字符串。添加自定义对象作为参数后,我现在得到一个415不支持的媒体类型错误,当从.NET Windows应用程序。有趣的是,我可以使用javascript和jQuery ajax方法成功地调用这个方法。

Web API 2服务方法如下所示:

<HttpPost>
<HttpGet>
<Route("{view}")>
Public Function GetResultsWithView(view As String, pPaging As Paging) As HttpResponseMessage
   Dim resp As New HttpResponseMessage
   Dim lstrFetchXml As String = String.Empty
   Dim lstrResults As String = String.Empty

   Try
      '... do some work here to generate xml string for the response
      '// write xml results to response
      resp.Content = New StringContent(lstrResults)
      resp.Content.Headers.ContentType.MediaType = "text/xml"
      resp.Headers.Add("Status-Message", "Query executed successfully")
      resp.StatusCode = HttpStatusCode.OK
   Catch ex As Exception
      resp.StatusCode = HttpStatusCode.InternalServerError
      resp.Headers.Add("Status-Message", String.Format("Error while retrieving results from view {0}: {1}", view, ex.Message))
   End Try
   Return resp
End Function

该方法允许POST和GET,因为分页对象是可选的。如果我用GET请求调用这个方法,它会工作。

简单。调用服务的NET客户端代码如下所示:

Dim uri As String = BASE_URI + "fetch/someview"
Dim resp As HttpWebResponse
Dim sr As StreamReader
Dim lstrResponse As String
Dim reqStream As Stream
Dim bytData As Byte()
Dim req As HttpWebRequest = WebRequest.Create(uri)
Dim lstrPagingJSON As String
Dim lPaging As New Paging
Try
   lPaging.Page = 1
   lPaging.Count = 100
   lPaging.PagingCookie = ""
   req.Method = "POST"
   lstrPagingJSON = JsonSerializer(Of Paging)(lPaging)
   bytData = Encoding.UTF8.GetBytes(lstrPagingJSON)
   req.ContentLength = bytData.Length
   reqStream = req.GetRequestStream()
   reqStream.Write(bytData, 0, bytData.Length)
   reqStream.Close()
   req.ContentType = "application/json"

   resp = req.GetResponse()

   sr = New StreamReader(resp.GetResponseStream, Encoding.UTF8)
   lstrResponse = sr.ReadToEnd
   '// do something with the response here
Catch exweb As WebException
   txtOutput.AppendText("Error during request: " + exweb.Message)
Catch ex As Exception
   txtOutput.AppendText(String.Format("General error during request to {0}: {1}", uri, ex.Message))
End Try

的。NET客户端运行在4.5框架上,服务运行在4.5.2框架上。错误抛向resp=req。#################################################################################################有些事情我已经尝试过了:

  • 在客户端上,设置req。接受“application/xml”或“text/xml”的值
  • 在服务方法中,删除了“resp”行。所容纳之物标题。内容类型。MediaType=“text/xml”
  • 用一些静态JSON替换XML响应内容,尝试排除在请求中发送JSON并在响应中获取XML时出现的任何问题

到目前为止,无论我做什么尝试,我都会得到相同的415错误响应。

当我从javascript调用时,我提到了这个工作,这里是我的ajax调用正在工作:

$.ajax({
   headers: {},
   url: "api/fetch/someview",
   type: "POST",
   data: "{Count:100,Page:1,PagingCookie:\"\"}",
   contentType: "application/json; charset=utf-8",
   dataType: "xml",
   success: function (data) {
      alert("call succeeded");
   },
   failure: function (response) {
      alert("call failed");
   }
});

在服务端,路由配置或其他方面没有什么特别之处,它几乎都是现成的WebAPI2。我知道路由正在工作,调用被正确地路由到方法,它们不会意外地转到其他地方,所以我在这个过程中遗漏了什么。网络客户端?非常感谢您的帮助!

我试图创建一个全新的Web API服务,以排除现有服务的任何可能问题,我创建了一个控制器,它使用一个单独的方法将自定义对象作为参数。然后我试着从。NET客户端并得到相同的错误。我也尝试使用WebClient而不是HttpWebRequest,但仍然得到相同的错误。这也是以前用Web API(在Web API 2之前)为我工作的东西。

我还尝试使用Web API 1创建一个新的Web应用程序,当我用POST调用它时,我的复杂对象参数现在为空。我有另一个运行Web API 1的Web服务,并验证了我仍然可以成功地调用复杂的对象。不管我的问题是什么,它似乎是JSON在客户端和服务器之间传递的东西。我已经检查了我发送的JSON,它是有效的,对象定义也是客户端和服务器之间的精确匹配,所以JSON应该能够被服务器解析。


共有3个答案

冯奇思
2023-03-14

我也经历过这个错误。

我将添加到标题内容类型应用程序/json。更改后,我的提交成功!

吕永寿
2023-03-14

我在调用web apiendpoint时遇到了这个问题,并解决了它。

在我的案例中,这是客户端编码正文内容的方式的问题。我没有指定编码或媒体类型。指定它们解决了这个问题。

未指定编码类型,导致415错误:

var content = new StringContent(postData);
httpClient.PostAsync(uri, content);

指定编码和媒体类型,成功:

var content = new StringContent(postData, Encoding.UTF8, "application/json");
httpClient.PostAsync(uri, content);
谢烨烨
2023-03-14

解决了
在我的头撞到墙上几天后,这个问题似乎与客户端和服务器之间的内容类型协商有关。我更深入地研究了使用Fiddler检查来自客户端应用程序的请求详细信息,下面是Fiddler捕获的原始请求的屏幕截图:

显然缺少的是Content-Type标头,尽管我在原始文章中的代码示例中设置了它。我觉得奇怪的是,即使我在设置Content-Type,它也从未通过,所以我又看了看我的另一个(工作)代码,调用了一个不同的网络应用编程接口服务,唯一的区别是我碰巧设置了req.在这种情况下,写入请求主体之前的ContentType属性。我对这个新代码做了这个改变,做到了,现在出现了Content-Type,我从网络服务那里得到了预期的成功响应。我的新代码。NET客户端现在看起来像这样:

req.Method = "POST"
req.ContentType = "application/json"
lstrPagingJSON = JsonSerializer(Of Paging)(lPaging)
bytData = Encoding.UTF8.GetBytes(lstrPagingJSON)
req.ContentLength = bytData.Length
reqStream = req.GetRequestStream()
reqStream.Write(bytData, 0, bytData.Length)
reqStream.Close()
'// Content-Type was being set here, causing the problem
'req.ContentType = "application/json"

仅此而已,ContentType属性只需在写入请求主体之前进行设置

我相信这种行为是因为一旦内容写入主体,它就会流式传输到被调用的服务endpoint,在此之前需要设置与请求相关的任何其他属性。如果我错了或者这需要更多细节,请纠正我。

 类似资料:
  • 问题内容: 我正在使用JSON请求调用REST服务,并且它以错误响应。 请求内容类型设置为。 如果我在请求中不包含JSON对象,则效果很好。我正在使用JSON库。 我尝试使用几个不同的库,但这没什么区别。 有人可以帮我解决这个问题吗? 这是我的代码: 的值为: 问题答案: 不确定原因,但是从中 删除行解决了该问题。

  • 我用JSON请求调用REST服务,它用HTTP 415“不支持的媒体类型”错误进行响应。 请求内容类型设置为。 如果我在请求中不包含JSON对象,它就可以正常工作。我正在使用JSON库。 我试着使用了几个不同的库,但没有什么不同。 有人能帮我解决这个问题吗? 这是我的代码: 是:

  • 我必须做的是,我必须在给定的URL中发布JSON数据,其中JSON看起来像 和我的功能 当我张贴它的时候;我得到一个错误 “远程服务器返回错误:(415)不支持的媒体类型。” 有人知道吗;我错在哪里?

  • 问题内容: 我有一个现有的Web API 2服务,需要修改其中一个方法以将自定义对象作为另一个参数,当前该方法具有一个参数,该参数是来自URL的简单字符串。在将自定义对象添加为参数之后,从.NET Windows应用程序调用服务时,我现在收到415不支持的媒体类型错误。有趣的是,我可以使用javascript和jquery ajax方法成功调用此方法。 Web API 2服务方法如下所示: 该方法

  • 问题内容: 自数小时以来,我一直在尝试纠正http错误,但它仍显示不支持的页面。我在邮递员中添加标题。 这是我的Java代码 这是我的档案 问题答案: 通过和如何在响应流和请求流之间对对象进行序列化和反序列化。 将会发生的是,将从提供者的注册表中进行搜索,以查找可以处理的媒体类型。如果找不到,则Jersey无法处理该请求,并将发送415不支持的媒体类型。通常,你还应该在服务器端记录一个异常。不知道