ApiController로 원시 문자열을 반환하는 방법은 무엇입니까?


125

XML / JSON을 제공하는 ApiController가 있지만 내 작업 중 하나가 순수한 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 dec

5
아니요. 작동하지 않습니다. Web API에는 XML 및 JSON 포맷터 만 내장되어 있습니다. 다른 모든 경우에는 내 대답에 표시된대로 자체 포맷터를 빌드하거나 메서드에서 원시 HttpResponseMessages를 반환해야합니다.
Darin Dimitrov

HttpResponseMessage는 System.Net.Http 네임 스페이스에 있습니다.
James Lawruk 2015-08-12

8

또 다른 가능한 해결책. Web API 2에서는 base.Content () 메서드를 사용했습니다 APIController.

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

JSON 콘텐츠를 계속 다운로드하려는 IE9 버그를 해결하려면이 작업을 수행해야했습니다. 이것은 XML 유형 데이터에 대해서도 작동합니다.XmlMediaTypeFormatter미디어 포맷터 .

누군가에게 도움이되기를 바랍니다.


OP는 html 문자열을 돌려달라고 요구하고있었습니다. .. 그런 문자열은 어디에 있습니까? 그리고 JsonMediaTypeFormatter는 어떻게 html을 반환 할 수 있습니까?
joedotnot

4

다만 return Ok(value)그것은으로 간주됩니다 작동하지 않습니다 IEnumerable<char>.

대신 return Ok(new { Value = value })또는 유사하게 사용하십시오 .


0

mvc 컨트롤러 메서드에서 다음 webapi2 컨트롤러 메서드를 호출합니다.

<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

WebAPI가 아닌 MVC를 사용하는 경우 base.Content 메서드를 사용할 수 있습니다.

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

-2

우리는 html을 반환하지 않고 API에서 순수한 데이터를 반환하고 그에 따라 UI에서 데이터 형식을 지정해야하지만 다음을 사용할 수 있습니다.

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

그것은 나를 위해 작동합니다


6
더미 오브젝트에 무언가를 감싸는 것은 더 이상 순수하게 만들지 않습니다. HTML 데이터라면 그것을 숨기는 것은 의미가 없습니다.
Jouni Heikniemi

웹 API의 아이디어는 데이터를 반환하고 필요한 HTML을 추가하기 위해 UI를 떠나는 것입니다. 데이터가 HTML 인 경우가있을 수 있지만 이것이 표준이 아니라고 생각합니다.
user1075679 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.