如何使用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标签(可能是action属性的返回类型不同)?

Answers:


223

您可以让您的Web Api操作返回HttpResponseMessage,您可以完全控制其Content。在您的情况下,您可以使用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 2012年

5
不,这是行不通的。Web API仅内置XML和JSON格式化程序。对于其他所有内容,您将必须构建自己的格式化程序或从方法中返回原始的HttpResponseMessages,如我的答案所示。
达林·迪米特洛夫

HttpResponseMessage位于System.Net.Http命名空间中。
James Lawruk

8

另一个可能的解决方案。在Web API 2中,我使用了base.Content()方法APIController

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

我需要执行此操作来解决IE9错误,该错误一直试图下载JSON内容。通过使用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

如果使用的是MVC而不是WebAPI,则可以使用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 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.