Asp.net-Kern: Aktion mit Rohzeichenfolgenparameter

Sep 18 2020

Ich versuche, eine Aktion mit einem unformatierten Zeichenfolgenparameter zu schreiben.

Diese Zeichenfolge wird dynamisch als JSON analysiert, sodass die Schlüssel im JSON zur Kompilierungszeit nicht bekannt sind.

Ich habe die Methode folgendermaßen deklariert:

[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] string command)
{
    var cmd = MyCqrsCommand(command);
    return await Mediator.Send(cmd);
}

Ich rufe die Methode mit swagger auf, die einen Parameter als application / json anzeigt

Das Ergebnis ist dies

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "|4e0e9c40-4036f8a9873ecac8.",
  "errors": {
    "$": [ "The JSON value could not be converted to System.String. Path: $ | LineNumber: 0 | BytePositionInLine: 1."
    ]
  }
}

Ich habe zwei verschiedene Lösungen gefunden:

[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] object command)
{ ... }
    
[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction(string command)
{ ... }

Die Verwendung von Objekten ist nicht elegant, funktioniert aber. Die Verwendung von "string" in uri hat einige Einschränkungen, daher bevorzuge ich die vorherige.

Welches ist die beste Lösung? Und gibt es eine Möglichkeit, die Zeichenfolge in einen als Zeichenfolge und nicht als Objekt deklarierten Text einzufügen?

Antworten

1 MichaelWang Sep 25 2020 at 14:17

Welches ist die beste Lösung?

Ich bevorzuge die Verwendung von Objektparameterlösungen.

[HttpPost("MyAction")]
public async Task<ActionResult<long>> MyAction([FromBody] object command)
{ ... }

Aus dem Screenshot Ihrer Anfrage geht hervor, dass Sie ein JSON-Objekt { "key": "value" } an Ihre MyActionMethode gesendet haben . Sie sollten Ihren Parameter also nicht als deklarieren string.

Und gibt es eine Möglichkeit, die Zeichenfolge in einen als Zeichenfolge und nicht als Objekt deklarierten Text einzufügen?

Wenn Sie erwarten, "string" als Eingabeparameter zu verwenden, senden Sie einfach den Inhalt des Werts.

    [HttpPost("/MyAction")]
    public async Task<ActionResult<long>> MyAction([FromBody] string command)

1 mtkachenko Sep 18 2020 at 15:41

Verwenden Sie JsonObject als Eingabeparameter anstelle von Zeichenfolge und Objekt.