web-dev-qa-db-fra.com

Comment retourner une chaîne brute avec ApiController?

J'ai un ApiController qui sert XML/JSON, mais j'aimerais qu'une de mes actions retourne du code HTML pur. J'ai essayé le ci-dessous mais il retourne toujours XML/JSON.

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

Voici ce que retourne ci-dessus:

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

Existe-t-il un moyen de renvoyer uniquement le texte pur et non échappé sans même les balises XML environnantes (peut-être un attribut d'action de type retour différent)?

107
TruMan1

Vous pouvez demander à votre action Web Api de renvoyer une HttpResponseMessage pour laquelle vous avez le plein contrôle du contenu. Dans votre cas, vous pouvez utiliser un StringContent et spécifier le type de contenu correct:

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

Une autre solution possible. Dans Web API 2, j'ai utilisé la méthode base.Content () de APIController:

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

J'avais besoin de faire cela pour contourner un bogue d'IE9 où il essayait de télécharger du contenu JSON. Cela devrait également fonctionner pour les données de type XML en utilisant le formateur de média XmlMediaTypeFormatter.

J'espère que ça aide quelqu'un.

6
garryp

Juste return Ok(value) ne fonctionnera pas, il sera traité comme IEnumerable<char>.

Utilisez plutôt return Ok(new { Value = value }) ou simillar.

3
abatishchev

Si vous utilisez MVC plutôt que WebAPI, vous pouvez utiliser la méthode base.Content:

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

J'appelle la méthode de contrôleur webapi2 suivante à partir d'une méthode de contrôleur mvc:

<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

Je l'appelle depuis cette routine sur le serveur asp.net:

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