Je travaille actuellement avec ASP.NET Core RC2 et je rencontre des résultats étranges . J'ai donc un contrôleur MVC avec la fonction suivante:
public HttpResponseMessage Tunnel() {
var message = new HttpResponseMessage(HttpStatusCode.OK);
message.Content = new StringContent("blablabla", Encoding.UTF8);
message.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/plain");
message.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue {
NoCache = true
};
return message;
}
Si j'appelle cela avec postman avec un en-tête Accept défini sur du texte brut, j'obtiens cette réponse:
{
"Version": {
"Major": 1,
"Minor": 1,
"Build": -1,
"Revision": -1,
"MajorRevision": -1,
"MinorRevision": -1
},
"Content": {
"Headers": [
{
"Key": "Content-Type",
"Value": [
"text/plain"
]
}
]
},
"StatusCode": 200,
"ReasonPhrase": "OK",
"Headers": [
{
"Key": "Cache-Control",
"Value": [
"no-cache"
]
}
],
"RequestMessage": null,
"IsSuccessStatusCode": true
}
Je ne comprends vraiment pas comment il s’agit de la réponse générée au contrôleur ci-dessus. Il s’agit essentiellement d’une sérialisation JSON de l’ensemble du message et ne contient en aucun cas le "blablabla" que je voulais envoyer.
Le seul moyen d'obtenir le résultat souhaité est de faire en sorte que ma fonction de contrôleur renvoie string
au lieu de HttpResponse
, mais de cette manière, je ne peux pas définir d'en-têtes comme CacheControl
.
Ma question est donc la suivante: pourquoi ai-je cette réponse étrange? Cela me semble un comportement très étrange
Selon cet article , ASP.NET Core MVC ne prend pas en charge les méthodes de retour HttpResponseMessage
- par défaut.
Si vous souhaitez continuer à l'utiliser, vous pouvez, en utilisant WebApiCompatShim:
Microsoft.AspNetCore.Mvc.WebApiCompatShim
à votre projet.ConfigureServices()
: services.AddMvc().AddWebApiConventions();
Configurez l'itinéraire pour cela dans Configure()
:
app.UseMvc(routes =>
{
routes.MapWebApiRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
Si vous voulez définir l'en-tête Cache-Control
avec le contenu de la chaîne, essayez ceci:
[Produces("text/plain")]
public string Tunnel()
{
Response.Headers.Add("Cache-Control", "no-cache");
return "blablabla";
}
Dans ASP.NET Core, modifiez la réponse pendant son parcours dans le pipeline. Donc, pour les en-têtes, définissez-les directement comme dans cette réponse . (J'ai testé cela pour configurer les cookies.) Vous pouvez également définir le code d'état HTTP de cette manière.
Pour définir le contenu, et par conséquent utiliser un formateur spécifique, suivez la documentation Formater les données de réponse dans ASP.NET Web API principale . Cela vous permet d'utiliser des aides telles que JsonResult()
et ContentResult()
.
Un exemple complet de traduction de votre code pourrait être:
[HttpGet("tunnel")]
public ContentResult Tunnel() {
var response = HttpContext.Response;
response.StatusCode = (int) HttpStatusCode.OK;
response.Headers[HeaderNames.CacheControl] = CacheControlHeaderValue.NoCacheString;
return ContentResult("blablabla", "text/plain", Encoding.UTF8);
}