it-swarm.com.de

Wie gebe ich rohen String mit ApiController zurück?

Ich habe einen ApiController, der XML/JSON bedient, aber ich möchte, dass eine meiner Aktionen reines HTML zurückgibt. Ich habe das unten ausprobiert, aber es wird immer noch XML/JSON zurückgegeben.

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

Das ist, was das Obige zurückgibt:

<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, nicht umschriebenen Text ohne die umgebenden XML-Tags zurückzugeben (möglicherweise einen anderen Rückgabetyp für das Aktionsattribut)?

107
TruMan1

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

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

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

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

Ich musste dies tun, um einen IE9-Fehler zu umgehen, bei dem versucht wurde, JSON-Inhalte herunterzuladen. Dies sollte auch für XML-Daten mit dem Medienformatierer XmlMediaTypeFormatter funktionieren.

Hoffe das hilft jemandem.

6
garryp

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

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

3
abatishchev

Wenn Sie MVC anstelle von WebAPI verwenden, können Sie die base.Content-Methode verwenden:

return base.Content(result, "text/html", Encoding.UTF8);
0
Cossens

Ich rufe die folgende webapi2-Controller-Methode aus einer MVC-Controller-Methode auf:

<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 nenne es von dieser Routine aus auf dem asp.net-Server:

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
Liam