【问题标题】:How to return raw string with ApiController?如何使用 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 标记(可能是动作属性的不同返回类型)?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api


    【解决方案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, 
             new{content=YourStringContent})
        

        对我有用

        【讨论】:

        • 将某些东西包装在一个虚拟对象中并不会使其更加纯粹。如果 HTML 您的数据,那么隐藏它是没有意义的。
        • web api 的思想是返回数据,让 UI 添加所需的 HTML,也许我们会遇到一些数据是 HTML 的情况,但我认为这不是常态。
        猜你喜欢
        • 2014-06-07
        • 1970-01-01
        • 2023-04-05
        • 2013-11-29
        • 1970-01-01
        • 2020-02-08
        • 1970-01-01
        • 2011-03-05
        相关资源
        最近更新 更多