web-dev-qa-db-ja.com

ApiControllerで生の文字列を返す方法は?

XML/JSONを提供するApiControllerがありますが、アクションの1つが純粋な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タグなしで、エスケープされていない純粋なテキストのみを返す方法はありますか(アクションタイプの異なる戻りタイプ)。

117
TruMan1

Web Apiアクションに、コンテンツを完全に制御できるHttpResponseMessageを返すことができます。あなたの場合、StringContentを使用し、正しいコンテンツタイプを指定します。

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

別の可能な解決策。 Web API 2では、APIControllerのbase.Content()メソッドを使用しました。

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

JSONコンテンツをダウンロードしようとするIE9のバグを回避するには、これを行う必要がありました。これは、XmlMediaTypeFormatterメディアフォーマッタを使用して、XMLタイプのデータでも機能するはずです。

それが誰かを助けることを願っています。

7
garryp

return Ok(value)は機能しません。IEnumerable<char>として扱われます。

代わりにreturn Ok(new { Value = value })またはsimillarを使用してください。

3
abatishchev

WebAPIではなくMVCを使用している場合、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