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


125

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タグさえもない、純粋なエスケープされていないテキストだけを返す方法はありますか?

回答:


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
いいえ、機能しません。Web APIには、XMLおよびJSONフォーマッターのみが組み込まれています。それ以外の場合は、独自のフォーマッタを作成するか、私の回答に示すように、メソッドから生のHttpResponseMessagesを返す必要があります。
Darin Dimitrov

HttpResponseMessageは、System.Net.Http名前空間にあります。
James Lawruk、2015

8

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

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

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

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


OPはHTML文字列を返すように求めていました..そのような文字列はどこにありますか?JsonMediaTypeFormatterはどのようにhtmlを返すことができますか?
joedotnot

4

機能しreturn Ok(value)ないだけで、として扱われIEnumerable<char>ます。

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


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 2014年

Web APIのアイデアは、データを返し、UIを残して必要なHTMLを追加することです。データがHTMLである場合もあるかもしれませんが、それは標準ではないと思います。
user1075679 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.