Come restituire una stringa non elaborata con ApiController?


125

Ho un ApiController che serve XML / JSON, ma vorrei che una delle mie azioni restituisse HTML puro. Ho provato il seguito ma restituisce comunque XML / JSON.

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

Ecco cosa restituisce quanto sopra:

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

C'è un modo per restituire solo il testo puro e senza caratteri di escape senza nemmeno i tag XML circostanti (forse un diverso tipo di attributo di restituzione dell'attributo dell'azione)?

Risposte:


223

È possibile che l'azione Web Api restituisca una HttpResponseMessageper la quale si ha il pieno controllo sul contenuto. Nel tuo caso potresti usare StringContent e specificare il tipo di contenuto corretto:

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

o

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

Non ho ancora provato, ma mi chiedo se avrei impostato il tipo di dati su HTML funzionerebbe?
ADT

5
No, non funzionerà. L'API Web ha solo formattatori XML e JSON integrati. Per tutto il resto dovrai costruire il tuo formattatore o restituire i messaggi HttpResponse grezzi dai tuoi metodi, come mostrato nella mia risposta.
Darin Dimitrov,

HttpResponseMessage si trova nello spazio dei nomi System.Net.Http.
James Lawruk,

8

Un'altra possibile soluzione. In Web API 2 ho usato il metodo base.Content () di APIController:

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

Ho dovuto fare questo per aggirare un bug IE9 in cui continuava a provare a scaricare contenuto JSON. Questo dovrebbe funzionare anche per i dati di tipo XML utilizzando il XmlMediaTypeFormatterformatter multimediale.

Spero che aiuti qualcuno.


l'OP stava chiedendo di restituire una stringa html .. dov'è una stringa del genere? e come può JsonMediaTypeFormatter restituire HTML?
Joedotnot non è il

4

Semplicemente return Ok(value)non funzionerà, verrà trattato come IEnumerable<char>.

Invece usa return Ok(new { Value = value })o simillar.


0

Chiamo il seguente metodo controller webapi2 da un metodo controller 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

Lo chiamo da questa routine sul server 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

Se si utilizza MVC anziché WebAPI, è possibile utilizzare il metodo base.Content:

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

-2

Dobbiamo sforzarci di non restituire html ma dati puri dalle nostre API e formattare i dati di conseguenza nell'interfaccia utente, ma forse puoi usare:

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

per me funziona


6
Avvolgere qualcosa in un oggetto fittizio non lo rende più puro. Se l'HTML è il tuo dato, non ha senso nasconderlo.
Jouni Heikniemi,

L'idea di API Web è quella di restituire dati e lasciare l'interfaccia utente per aggiungere l'HTML richiesto, forse possiamo avere alcuni casi in cui i dati sono HTML, ma penso che non sia la norma.
user1075679
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.