如何使用 ApiController 返回原始字符串?

我有一个提供 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 属性的返回类型) ?

90890 次浏览

您可以让您的 WebApi 操作返回一个 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,而是从 API 中返回纯数据,并在 UI 中相应地格式化数据,但也许你可以使用:

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

对我有用

只有 return Ok(value)不会工作,它将作为 IEnumerable<char>受到威胁。

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

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

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

我需要这样做来避免 IE9 bug,因为它总是试图下载 JSON 内容。这也可以通过使用 XmlMediaTypeFormatter媒体格式化程序来处理 XML 类型的数据。

希望这对某人有帮助。

我从 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

如果你使用的是 MVC 而不是 WebAPI,你可以使用 base:

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