it-swarm.com.ru

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

107
TruMan1

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

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

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

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

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

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

6
garryp

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

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

3
abatishchev

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

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

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