Как вернуть необработанную строку с ApiController?

У меня есть 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 (возможно, другой атрибут возвращаемого типа действия)?

Ответ 1

Вы можете вернуть действие веб-Api HttpResponseMessage, для которого вы полностью контролируете контент. В вашем случае вы можете использовать StringContent и указать правильный тип контента:

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

Ответ 2

Просто return Ok(value) не будет работать, он будет рассматриваться как IEnumerable<char>.

Вместо этого используйте return Ok(new { Value = value }) или simillar.

Ответ 3

Другое возможное решение. В Web API 2 я использовал метод base.Content() APIController:

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

Мне нужно было сделать это, чтобы обойти ошибку IE9, где она пыталась загрузить содержимое JSON. Это также должно работать для данных типа XML, используя форматтера XmlMediaTypeFormatter.

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

Ответ 4

Мы должны стремиться не возвращать html, а чистые данные из нашего API и соответственно форматировать данные в пользовательском интерфейсе, но, возможно, вы можете использовать:

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

он работает для меня

Ответ 5

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

Ответ 6

Если вы используете MVC, а не WebAPI, вы можете использовать метод base.Content:

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