wake-up-neo.net

ASP.NET Core HTTPRequestMessage gibt eine seltsame JSON-Nachricht zurück

Ich arbeite derzeit mit ASP.NET Core RC2 und bin auf einige seltsame Ergebnisse gestoßen ... Da habe ich einen MVC-Controller mit der folgenden Funktion:

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;
}

Wenn ich das mit Postman mit einem Accept-Header auf text plain nenne, erhalte ich diese Antwort:

{
  "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
}

Ich verstehe wirklich nicht, wie dies die generierte Antwort auf den obigen Controller ist. Es ist im Grunde eine JSON-Serialisierung der gesamten Nachricht selbst und enthält in keiner Weise die "blablabla", die ich senden wollte.

Die einzige Möglichkeit, das gewünschte Ergebnis zu erzielen, besteht darin, dass meine Controller-Funktion string anstelle von HttpResponse zurückgibt. Auf diese Weise kann ich jedoch keine Header wie CacheControl setzen.

Meine Frage lautet also: Warum bekomme ich diese seltsame Antwort? Es scheint mir sehr komisch zu sein

15
larzz11

Gemäß diesem Artikel unterstützt ASP.NET Core MVC standardmäßig keine HttpResponseMessage- Methoden, die standardmäßig Methoden zurückgeben.

Wenn Sie es weiterhin verwenden möchten, können Sie mit WebApiCompatShim Folgendes tun:

  1. Fügen Sie Ihrem Projekt einen Verweis auf Microsoft.AspNetCore.Mvc.WebApiCompatShim hinzu.
  2. Konfigurieren Sie es in ConfigureServices(): services.AddMvc().AddWebApiConventions();
  3. Richten Sie die Route in Configure() ein:

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

Wenn Sie den Cache-Control-Header mit dem String-Inhalt setzen möchten, versuchen Sie Folgendes:

[Produces("text/plain")]
public string Tunnel()
{
    Response.Headers.Add("Cache-Control", "no-cache");
    return "blablabla";
}
2
adem caglin

Ändern Sie in ASP.NET Core die Antwort, während sie die Pipeline durchläuft. Setzen Sie sie also für Header direkt in diese Antwort . (Ich habe dies zum Setzen von Cookies getestet.) Sie können den HTTP-Statuscode auch auf diese Weise festlegen.

Folgen Sie der Dokumentation Formatieren Sie die Antwortdaten in ASP.NET Core Web API , um den Inhalt festzulegen und daher ein bestimmtes Formatierungsprogramm zu verwenden. So können Sie Helfer wie JsonResult() und ContentResult() verwenden.

Ein vollständiges Beispiel für die Übersetzung Ihres Codes könnte sein:

[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