web-dev-qa-db-fra.com

ASP.NET Core HTTPRequestMessage renvoie un message JSON étrange

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

15
larzz11

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:

  1. Ajoutez une référence à Microsoft.AspNetCore.Mvc.WebApiCompatShim à votre projet.
  2. Configurez-le dans ConfigureServices(): services.AddMvc().AddWebApiConventions();
  3. Configurez l'itinéraire pour cela dans Configure():

    app.UseMvc(routes =>
    {
        routes.MapWebApiRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
    
11
svick

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";
}
2
adem caglin

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);
}
1
Alex Angas