0
votes

Que revenir pour obtenir un résultat fortement typé, y compris les erreurs dans un httpbet? ActionResult où T est Filecontentresult ne fonctionne pas

J'essaie de retourner une image et dans certains cas des codes d'erreur. Au début, j'ai essayé de revenir à la tâche code>, ce qui fonctionne lorsque j'ai quelque chose à retourner. Mais si je veux dire par exemple retour badrequest () code>, je reçois une erreur de compilateur

ne peut pas convertir implicitement de type 'microsoft.aspnetcore.mvc.badrequestobjectsult' vers 'Microsoft.aspnetcore.mvc.fileconTresult' P> blockquote>

Pour résoudre ce problème, je retourne un actionResult code> à la place. Et il fonctionne. Mais cela accepte quelque chose. Je veux être clair sur ce que je veux revenir. Existe-t-il un moyen d'utiliser le actionResResResResults fortement dactylographié code> ou quelque chose de similaire afin de renvoyer l'un quelconque de fichier code> (pour 200 succès) et BADREQUEST code >, NOTFound code> etc. fonctionnera? P>

    [HttpGet("path")]
    [Produces("image/jpeg", "image/webp", "text/plain")]
    public async Task<ActionResult<FileContentResult>> Get(/*parameters*/)
    {
        if(/*invalid parameters*/)
        {
           return BadRequest("invalid parameters");
        }
        Byte[] image = GetImage();
        return File(image, "image/jpeg");
    }


4 commentaires

Vous savez, des exceptions sont une chose.


@THeperplexedone J'essaie de retourner des codes d'erreur appropriés et de conserver avec les conventions de net ASP.


Essayez de retourner une iactionResult


Les exceptions peuvent être attrapées par middleware pour renvoyer des réponses JSON appropriées.


3 Réponses :


1
votes

Vous devez utiliser un iagresResult xxx


2 commentaires

Merci mais ma question est de revenir fortement typé actionResult où t = filecontentresult (ou comment se comporter comme filecontentresult avec actionResult ). Je sais iacctionResult fonctionne mais cela n'indique pas le type de retour.


OK, si vous voulez être clair sur ce que vous voulez revenir, ajoutez [ProducesResponsonType (StatusCodes.Status400BADREQUEST)]



1
votes

La réponse est non. Le type générique param param work for actionResult est pour un type sérialisable. Essentiellement, il va renvoyer un ObjectResult , et par conséquent, peut traiter d'autres types de résultats tels que BadRequestObjectsult , etc.. Toutefois, filecontentresult n'hérite pas de ObjectResult et n'est pas un type sérialisable. Par conséquent, il n'est pas éligible d'être utilisé ici.

Si vous retournez un fichier et que vous devez pouvoir retourner d'autres résultats de code d'état, tout ce que vous pouvez utiliser est iacctionResult , qui permettra évidemment tout type de résultat possible.

Le ProducesResponSeType peut être utilisé à des fins de la documentation, mais il n'aura aucune incidence sur le type de retour réel de quelque manière que ce soit.


0 commentaires

1
votes

Je lancerais une idée httpRequestException et définiriez le code de réponse HTTP qui a le plus de sens pour vous.

Si j'étais un autre développeur en regardant votre code, cela serait logique pour moi de voir le filecontentreSult comme type concret et ensuite Voir également le HTTPequestException lancé pour les paramètres non valides. P>

[HttpGet("path")]
[Produces("image/jpeg", "image/webp", "text/plain")]
public async Task<ActionResult<FileContentResult>> Get(/*parameters*/)
{
    if(/*invalid parameters*/)
    {
       throw new HttpResponseException(/* invalid parameters message */, HttpStatusCode.BadRequest)
    }
    Byte[] image = GetImage();
    return File(image, "image/jpeg");
}


0 commentaires