138

我有一个提供 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 标记(可能是动作属性的不同返回类型)?

4

6 回答 6

241

您可以让您的 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"
        )
    });
}
于 2012-12-26T21:27:39.347 回答
10

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

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

我需要这样做来解决一个 IE9 错误,它一直试图下载 JSON 内容。XmlMediaTypeFormatter通过使用媒体格式化程序,这也应该适用于 XML 类型的数据。

希望对某人有所帮助。

于 2016-10-06T15:14:39.283 回答
5

只是return Ok(value)行不通,它会被威胁为IEnumerable<char>.

而是使用return Ok(new { Value = value })或类似。

于 2016-08-12T21:35:57.940 回答
1

如果您使用的是 MVC 而不是 WebAPI,则可以使用 base.Content 方法:

return base.Content(result, "text/html", Encoding.UTF8);
于 2017-11-20T12:01:02.193 回答
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
于 2017-02-28T09:42:28.503 回答
-3

我们必须努力不返回 html,而是从我们的 API 中返回纯数据,并在 UI 中相应地格式化数据,但也许你可以使用:

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

这个对我有用

于 2013-10-21T16:29:18.297 回答