如何使用 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/">&lt;strong&gt;test&lt;/strong&gt;</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&lt;char&gt;

改为使用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 返回原始字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 ApiController 的所有操作列表

.NET (ApiController) / jQuery .ajax:从 POST 返回啥?

在调用不同 API 的 APIController 方法中返回 HttpResponse

PDOStatement::fetchAll() 返回的数组中的每个字段都是字符串类型(PHP + MySQL)。如何保留原始字段类型?

使用 System.Web.Http.ApiController + Postman 进行身份验证 - 没有遇到断点/不确定这是如何工作的

从MySQL数据库获取后如何将python字符串转换为原始类型