首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >调用Web API 2终结点时出现HTTP 415不支持的媒体类型错误

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

Stack Overflow用户
提问于 2016-01-08 00:45:03
回答 7查看 191.9K关注 0票数 53

我有一个现有的Web API 2服务,需要修改其中一个方法以接受自定义对象作为另一个参数,目前该方法有一个参数,它是来自URL的简单字符串。在添加自定义对象作为参数后,当从.NET windows应用程序调用服务时,我现在收到415不支持的媒体类型错误。有趣的是,我可以使用javascript和jquery ajax方法成功地调用此方法。

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

代码语言:javascript
复制
<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

该方法同时允许POSTGET,因为Paging对象是可选的。如果我用一个GET请求调用这个方法,它就能工作。

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

代码语言:javascript
复制
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.GetResponse()行抛出错误。一些我已经尝试过的东西:

在客户机上,将XML值设置为“/ XML”或将服务方法设置为"text/xml"

  • in,使用一些静态req.Accept删除了`resp.Content.Headers.ContentType.MediaType =“text/xml”
  • inreq.Accept响应内容这一行,并尝试排除在请求上发送`resp.Content.Headers.ContentType.MediaType以及在响应

上返回XML时出现的任何问题

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

当从javascript调用时,我提到了这是有效的,这是我的ajax调用,它是有效的:

代码语言:javascript
复制
$.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。我知道路由在工作,调用被正确地路由到方法,它们不会意外地到达其他地方,那么我在.NET客户机中遗漏了什么呢?任何帮助都是非常感谢的!

更新--

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

更新--

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-01-09 03:59:37

已解决的

在这个问题上我的头撞了几天后,看起来这个问题与客户端和服务器之间的内容类型协商有关。我深入研究了使用Fiddler检查来自客户端应用程序的请求细节,这是fiddler捕获的原始请求的屏幕截图:

这里明显缺少的是Content-Type头,尽管我在我最初的帖子中的代码示例中设置了它。我觉得奇怪的是,尽管我设置了Content-Type,但它从来没有通过,所以我再次查看了调用不同Web API服务的其他(工作)代码,唯一的区别是,在这种情况下,我碰巧在写入请求体之前设置了req.ContentType属性。我对这段新代码进行了更改,就这样,Content-Type现在出现了,我从web服务获得了预期的成功响应。来自我的.NET客户端的新代码现在看起来像这样:

代码语言:javascript
复制
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属性

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

票数 66
EN

Stack Overflow用户

发布于 2017-02-14 03:39:40

我在调用我的web api端点时遇到了这个问题,并解决了它。

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

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

代码语言:javascript
复制
var content = new StringContent(postData);
httpClient.PostAsync(uri, content);

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

代码语言:javascript
复制
var content = new StringContent(postData, Encoding.UTF8, "application/json");
httpClient.PostAsync(uri, content);
票数 41
EN

Stack Overflow用户

发布于 2018-07-23 11:37:22

我也经历过这个错误。

我在头文件Content-Type中添加了:application/json。更改之后,我的提交成功了!

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34660641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档