如何使用 ApiController 返回原始字符串?
Posted
技术标签:
【中文标题】如何使用 ApiController 返回原始字符串?【英文标题】:How to return raw string with ApiController? 【发布时间】:2012-12-12 08:32:15 【问题描述】:我有一个提供 XML/JSON 的 ApiController,但我希望我的操作之一返回纯 html。我尝试了以下方法,但它仍然返回 XML/JSON。
public string Get()
return "<strong>test</strong>";
这是上面返回的内容:
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/"><strong>test</strong></string>
有没有办法只返回纯的、未转义的文本,甚至没有周围的 XML 标记(可能是动作属性的不同返回类型)?
【问题讨论】:
【参考方案1】:您可以让您的 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 是否可行? 不,这行不通。 Web API 仅内置了 XML 和 JSON 格式化程序。对于其他所有内容,您必须构建自己的格式化程序或从您的方法返回原始 HttpResponseMessages,如我的回答所示。 HttpResponseMessage 位于 System.Net.Http 命名空间中。【参考方案2】:另一种可能的解决方案。在 Web API 2 中,我使用了 APIController
的 base.Content() 方法:
public IHttpActionResult Post()
return base.Content(HttpStatusCode.OK, new , new JsonMediaTypeFormatter(), "text/plain");
我需要这样做来解决一个 IE9 错误,该错误一直试图下载 JSON 内容。通过使用XmlMediaTypeFormatter
媒体格式化程序,这也应该适用于 XML 类型的数据。
希望对某人有所帮助。
【讨论】:
OP 要求返回一个 html 字符串。这样的字符串在哪里? JsonMediaTypeFormatter 如何返回 html ? 谢谢,在编写自己的 MediaTypeFormatter 以返回不透明的纯字符串之前,我找到了您的答案一步,我猜想 JsonMediaTypeFormatter 也可以处理 text/plain【参考方案3】:只是return Ok(value)
不起作用,它将被威胁为IEnumerable<char>
。
改为使用return Ok(new Value = value )
或类似名称。
【讨论】:
return Ok(stringValue) 对我来说效果很好。 [c#webapi net5.0] @theSushil:这可能在 .NET Core 或 .NET 5 中已更改。响应来自 2016 年,即 .NET Core 之前的时间,这是一个问题。【参考方案4】:如果你使用的是 MVC 而不是 WebAPI,你可以使用 base.Content 方法:
return base.Content(result, "text/html", Encoding.UTF8);
【讨论】:
【参考方案5】:我从一个 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
【讨论】:
【参考方案6】:我们必须努力不返回 html,而是从我们的 API 中返回纯数据,并在 UI 中相应地格式化数据,但也许你可以使用:
return this.Request.CreateResponse(HttpStatusCode.OK,
newcontent=YourStringContent)
对我有用
【讨论】:
将某些东西包装在一个虚拟对象中并不会使其更加纯粹。如果 HTML 是您的数据,那么隐藏它是没有意义的。 web api 的思想是返回数据,让 UI 添加所需的 HTML,也许我们会遇到一些数据是 HTML 的情况,但我认为这不是常态。以上是关于如何使用 ApiController 返回原始字符串?的主要内容,如果未能解决你的问题,请参考以下文章
.NET (ApiController) / jQuery .ajax:从 POST 返回啥?
在调用不同 API 的 APIController 方法中返回 HttpResponse
PDOStatement::fetchAll() 返回的数组中的每个字段都是字符串类型(PHP + MySQL)。如何保留原始字段类型?
使用 System.Web.Http.ApiController + Postman 进行身份验证 - 没有遇到断点/不确定这是如何工作的