Как вернуть необработанную строку с помощью 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

Вы можете сделать так, чтобы действие Web 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средства форматирования мультимедиа.

Надеюсь, это кому-то поможет.


OP просил вернуть строку 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. Возможно, у нас могут быть случаи, когда данные представляют собой HTML, но я думаю, что это не норма.
user1075679
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.