HTTP 415 Nicht unterstützter Medientyp-Fehler beim Aufrufen des Web API 2-Endpunkts

Ich habe einen vorhandenen Web-API-2-Dienst und muss eine der Methoden ändern, um ein benutzerdefiniertes Objekt als weiteren Parameter zu verwenden. Derzeit hat die Methode einen Parameter, der eine einfache Zeichenfolge aus der URL ist. Nach dem Hinzufügen des benutzerdefinierten Objekts als Parameter wird jetzt ein 415 nicht unterstützter Medientypfehler angezeigt, wenn der Dienst über eine .NET Windows-App aufgerufen wird. Interessanterweise kann ich diese Methode mit Javascript und der Methode jquery ajax erfolgreich aufrufen.

Die Web API 2-Dienstmethode sieht folgendermaßen aus:

<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

Die Methode erlaubt beidePOST undGET weil derPagingas Objekt @ ist optional. Wenn ich diese Methode mit einem @ aufruGET Anfrage es funktioniert.

Und der einfache .NET-Client-Code, der den Dienst aufruft, sieht folgendermaßen aus:

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

Der .NET-Client wird auf dem 4.5-Framework ausgeführt, und der Dienst befindet sich auf dem 4.5.2-Framework. Der Fehler wird am @ geworfresp = req.GetResponse() Linie. Einige Dinge habe ich schon probiert:

etzen Sie auf dem Client dasreq.Accept Wert auf "application / xml" oder "text / xml"ntfernen Sie in der Dienstmethode die Zeile `resp.Content.Headers.ContentType.MediaType =" text / xml " Ersetzen Sie den XML-Antwortinhalt durch statisches JSON, und versuchen Sie, Probleme mit dem Senden von JSON für die Anforderung und dem Zurückerhalten von XML für die Antwort auszuschließen.

So weit bekomme ich immer die gleiche 415 Fehlerantwort, egal was ich versuche.

Ich erwähnte, dass dies funktioniert, wenn es über Javascript aufgerufen wird. Hier ist mein Ajax-Aufruf, der funktioniert:

$.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");
   }
});

uf der Service-Seite gibt es nichts Besonderes mit der Routenkonfiguration oder etwas anderem zu tun, es ist so ziemlich alles einsatzbereit , sie gehen nicht unerwartet woanders hin. Was fehlt mir also im .NET-Client? Jede Hilfe wird sehr geschätzt!

--- UPDATE ---
Ich habe versucht, einen vollständig neuen Web-API-Dienst zu erstellen, um mögliche Probleme mit dem vorhandenen Dienst auszuschließen. Ich habe einen Controller mit einer einzigen Methode erstellt, die ein benutzerdefiniertes Objekt als Parameter verwendet. Ich versuchte dann, das vom .NET Klienten aufzurufen und erhielt den gleichen Fehler. Ich habe auch versucht, WebClient anstelle von HttpWebRequest zu verwenden, erhalte aber immer noch den gleichen Fehler. Dies funktionierte früher auch mit der Web-API (vor der Web-API 2).

--- UPDATE ---
Ich habe auch versucht, eine neue Web-App mit der Web-API 1 zu erstellen. Wenn ich das mit einem POST aufrufe, kommt mein komplexer Objektparameter jetzt auf null. Ich habe einen anderen Webdienst, auf dem die Web-API 1 ausgeführt wird, und habe überprüft, dass ich das mit komplexen Objekten weiterhin erfolgreich aufrufen kann. Was auch immer mein Problem ist, es scheint etwas mit dem JSON zu sein, das zwischen dem Client und dem Server übertragen wird. Ich habe den von mir gesendeten JSON-Code überprüft und festgestellt, dass er gültig ist. Die Objektdefinition stimmt auch genau mit dem Client und dem Server überein, sodass der JSON-Code vom Server analysiert werden kann.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage