J'ai un ApiController qui sert XML/JSON, mais j'aimerais qu'une de mes actions retourne du code HTML pur. J'ai essayé le ci-dessous mais il retourne toujours XML/JSON.
public string Get()
{
return "<strong>test</strong>";
}
Voici ce que retourne ci-dessus:
<string xmlns="http://schemas.Microsoft.com/2003/10/Serialization/"><strong>test</strong></string>
Existe-t-il un moyen de renvoyer uniquement le texte pur et non échappé sans même les balises XML environnantes (peut-être un attribut d'action de type retour différent)?
Vous pouvez demander à votre action Web Api de renvoyer une HttpResponseMessage
pour laquelle vous avez le plein contrôle du contenu. Dans votre cas, vous pouvez utiliser un StringContent et spécifier le type de contenu correct:
public HttpResponseMessage Get()
{
return new HttpResponseMessage()
{
Content = new StringContent(
"<strong>test</strong>",
Encoding.UTF8,
"text/html"
)
};
}
Une autre solution possible. Dans Web API 2, j'ai utilisé la méthode base.Content () de APIController
:
public IHttpActionResult Post()
{
return base.Content(HttpStatusCode.OK, new {} , new JsonMediaTypeFormatter(), "text/plain");
}
J'avais besoin de faire cela pour contourner un bogue d'IE9 où il essayait de télécharger du contenu JSON. Cela devrait également fonctionner pour les données de type XML en utilisant le formateur de média XmlMediaTypeFormatter
.
J'espère que ça aide quelqu'un.
Juste return Ok(value)
ne fonctionnera pas, il sera traité comme IEnumerable<char>
.
Utilisez plutôt return Ok(new { Value = value })
ou simillar.
Si vous utilisez MVC plutôt que WebAPI, vous pouvez utiliser la méthode base.Content:
return base.Content(result, "text/html", Encoding.UTF8);
J'appelle la méthode de contrôleur webapi2 suivante à partir d'une méthode de contrôleur mvc:
<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
Je l'appelle depuis cette routine sur le serveur 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