Як повернути необроблений рядок за допомогою ApiController?


125

У мене є ApiController, який обслуговує XML / JSON, але я хотів би, щоб одна з моїх дій повернула чистий HTML. Я спробував нижче, але він все ще повертає XML / JSON.

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

Ось що повертає вище:

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

Чи є спосіб повернути лише чистий нерозміщений текст без навколишніх тегів XML (можливо, інший атрибут повернення типу дії)?

Відповіді:


223

Ви можете зробити так, щоб ваша дія веб-Api повернула запит, HttpResponseMessageна який ви маєте повний контроль над Вмістом. У вашому випадку ви можете використовувати StringContent і вказати правильний тип вмісту:

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

або

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

Я ще не намагався, але мені цікаво, чи встановив би тип даних html?
adt

5
Ні, це не спрацює. Веб-API має лише вбудовані формати XML та JSON. Для всього іншого вам доведеться створити власний формат або повернути неочищені повідомлення HttpResponseMessages зі своїх методів, як показано в моїй відповіді.
Дарин Димитров

HttpResponseMessage розташований у просторі імен System.Net.Http.
Джеймс Лорук

8

Ще одне можливе рішення. У Web API 2 я використав метод base.Content () APIController:

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

Мені потрібно було це зробити, щоб уникнути помилки IE9, де вона постійно намагалася завантажити вміст JSON. Це також має працювати для даних типу XML за допомогою XmlMediaTypeFormatterмедіаформатора.

Сподіваюся, що хтось допомагає.


ОП просила повернути HTML-рядок .. де така рядок? і як JsonMediaTypeFormatter може повернути HTML?
Joedotnot

4

Просто return Ok(value)не буде працювати, це буде розглядатися як IEnumerable<char>.

Замість цього використовуйте return Ok(new { Value = value })або подібне.


0

Я називаю такий метод контролера webapi2 від методу контролера 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

Я називаю це з цієї програми на сервері 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

Якщо ви використовуєте MVC, а не WebAPI, ви можете використовувати метод base.Content:

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

-2

Ми повинні прагнути не повертати HTML, а чисті дані з API і форматувати дані відповідно в інтерфейсі, але, можливо, ви можете використовувати:

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

це працює для мене


6
Загортання чогось у манекенний предмет не робить його більш чистим. Якщо HTML - це ваші дані, приховувати їх немає сенсу.
Jouni Heikniemi

Ідея веб-api полягає в тому, щоб повернути дані та залишити інтерфейс користувача, щоб додати необхідний HTML-код.
користувач1075679
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.