2012-12-26 34 views
96

我有提供XML/JSON的ApiController,但我想我的行動來回報純HTML之一。我嘗試了下面,但它仍然返回XML/JSON。如何使用ApiController返回原始字符串?

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屬性的不同的返回類型)?

回答

177

你可以讓你的網絡API操作返回HttpResponseMessage您擁有對內容的完全控制。在你的情況,你可能會使用的StringContent並指定正確的內容類型:

public HttpResponseMessage Get() 
{ 
    return new HttpResponseMessage() 
    { 
     Content = new StringContent(
      "<strong>test</strong>", 
      Encoding.UTF8, 
      "text/html" 
     ) 
    }; 
} 
+0

我還沒試過,但我想知道如果我將數據類型設置爲html w會工作嗎? – adt

+4

不,它不會工作。 Web API只有內置的XML和JSON格式器。對於其他所有內容,您將必須構建自己的格式化程序或從您的方法返回原始HttpResponseMessages,如我的答案中所示。 –

+0

工作Darin甜! :) – TruMan1

0

我們必須努力不返回HTML,但我們的API和格式的數據相應的UI純數據,但也許你可以使用:

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

它爲我工作

+4

在虛擬對象中包裝某些東西並不會使它變得更純粹。如果HTML是您的數據,則隱藏它是沒有意義的。 –

+0

web api的想法是返回數據,並留下UI添加所需的HTML,也許我們可以有一些情況下數據是HTML,但我認爲這不是常態。 – user1075679

4

只是return Ok(value)將無法​​正常工作,這將被視爲IEnumerable<char>

而是使用return Ok(new { Value = value })或呈三角。

3

另一種可能的解決方案。在網絡API 2我用的APIController的base.Content()方法:

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

我需要這樣做是爲了避開一個IE9臭蟲,它一直試圖下載JSON內容。這也適用於使用XmlMediaTypeFormatter媒體格式化程序的XML類型數據。

希望幫助別人。

+0

這對我有幫助。謝謝。 – hello

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 
0

如果您正在使用MVC而比WebAPI你可以使用base.Content方法:

return base.Content(result, "text/html", Encoding.UTF8); 
相關問題