2012-12-26 7 views
96

Ich habe einen ApiController, der XML/JSON bedient, aber ich möchte, dass eine meiner Aktionen reines HTML zurückgibt. Ich habe das folgende versucht, aber es gibt immer noch XML/JSON zurück.Wie man eine rohe Zeichenkette mit ApiController zurückgibt?

public string Get() 
{ 
    return "<strong>test</strong>"; 
} 

Dies ist, was die oben zurückkehrt:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">&lt;strong&gt;test&lt;/strong&gt;</string> 

Gibt es eine Möglichkeit nur den reinen, unescaped Text zurückzukehren, ohne auch nur die umliegenden XML-Tags (vielleicht einen anderen Rückgabetyp action-Attribut)?

Antwort

177

Sie könnten Ihre Web Api Aktion eine HttpResponseMessage zurückgeben, für die Sie die volle Kontrolle über den Inhalt haben. In Ihrem Fall könnten Sie eine StringContent verwenden und den richtigen Inhaltstyp angeben:

public HttpResponseMessage Get() 
{ 
    return new HttpResponseMessage() 
    { 
     Content = new StringContent(
      "<strong>test</strong>", 
      Encoding.UTF8, 
      "text/html" 
     ) 
    }; 
} 
+0

Ich habe noch nicht versucht, aber ich frage mich, ob ich den Datentyp auf HTML w gesetzt hätte könnte funktionieren? – adt

+4

Nein, es wird nicht funktionieren. Die Web-API enthält nur XML- und JSON-Formatierer. Für alles andere müssen Sie einen eigenen Formatierer erstellen oder unformatierte HttpResponseMessages von Ihren Methoden zurückgeben, wie in meiner Antwort gezeigt. –

+0

Süße, die daran gearbeitet hat !! :) – TruMan1

0

Wir müssen danach streben, nicht html sondern reine Daten aus unserer API und Formatdaten in der Benutzeroberfläche entsprechend zurück, aber vielleicht können Sie verwenden:

return this.Request.CreateResponse(HttpStatusCode.OK, 
    new{content=YourStringContent}) 

es funktioniert für mich

+4

Etwas in ein Dummy-Objekt zu wickeln macht es nicht reiner. Wenn der HTML-Code Ihre Daten ist, hat es keinen Sinn, sie zu verstecken. –

+0

Die Idee von Web-APIs besteht darin, Daten zurückzugeben und die Benutzeroberfläche zu verlassen, um den erforderlichen HTML-Code hinzuzufügen. Vielleicht können wir einige Fälle haben, in denen die Daten HTML sind, aber ich denke, das ist nicht die Norm. – user1075679

4

Nur return Ok(value) wird nicht funktionieren, wird es als IEnumerable<char> behandelt werden.

Verwenden Sie stattdessen return Ok(new { Value = value }) oder simillar.

3

Eine andere mögliche Lösung. In Web-API-2 verwendete ich die base.Content() -Methode von APIController:

public IHttpActionResult Post() 
    { 
     return base.Content(HttpStatusCode.OK, new {} , new JsonMediaTypeFormatter(), "text/plain"); 
    } 

ich dies um einen IE9 Fehler erhalten tun musste, wo es immer wieder versucht, JSON Inhalte herunterzuladen. Dies sollte auch für XML-Daten funktionieren, indem Sie den Medienformatierer XmlMediaTypeFormatter verwenden.

Hoffe, dass jemand hilft.

+0

Das hat mir geholfen. Vielen Dank. – hello

0

Ich nenne die folgenden webapi2 Controller-Methode von einem Mvc Controller-Methode:

<HttpPost> 
Public Function TestApiCall(<FromBody> screenerRequest As JsonBaseContainer) As IHttpActionResult 
    Dim response = Me.Request.CreateResponse(HttpStatusCode.OK) 
    response.Content = New StringContent("{""foo"":""bar""}", Encoding.UTF8, "text/plain") 
    Return ResponseMessage(response) 
End Function 

ich es von dieser Routine auf dem asp.net Server aufrufen:

Public Async Function PostJsonContent(baseUri As String, requestUri As String, content As String, Optional timeout As Integer = 15, Optional failedResponse As String = "", Optional ignoreSslCertErrors As Boolean = False) As Task(Of String) 
    Return Await PostJsonContent(baseUri, requestUri, New StringContent(content, Encoding.UTF8, "application/json"), timeout, failedResponse, ignoreSslCertErrors) 
End Function 

Public Async Function PostJsonContent(baseUri As String, requestUri As String, content As HttpContent, Optional timeout As Integer = 15, Optional failedResponse As String = "", Optional ignoreSslCertErrors As Boolean = False) As Task(Of String) 
    Dim httpResponse As HttpResponseMessage 

    Using handler = New WebRequestHandler 
     If ignoreSslCertErrors Then 
      handler.ServerCertificateValidationCallback = New Security.RemoteCertificateValidationCallback(Function(sender, cert, chain, policyErrors) True) 
     End If 

     Using client = New HttpClient(handler) 
      If Not String.IsNullOrWhiteSpace(baseUri) Then 
       client.BaseAddress = New Uri(baseUri) 
      End If 

      client.DefaultRequestHeaders.Accept.Clear() 
      client.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json")) 
      client.Timeout = New TimeSpan(TimeSpan.FromSeconds(timeout).Ticks) 

      httpResponse = Await client.PostAsync(requestUri, content) 

      If httpResponse.IsSuccessStatusCode Then 
       Dim response = Await httpResponse.Content.ReadAsStringAsync 
       If Not String.IsNullOrWhiteSpace(response) Then 
        Return response 
       End If 
      End If 
     End Using 
    End Using 

    Return failedResponse 
End Function 
0

Wenn Sie MVC verwenden eher als WebAPI können Sie die base.Content-Methode verwenden:

Verwandte Themen