HttpRequestMessage.Content est perdu lorsqu'il est lu dans une délégation DelegatingHandler dans l'API Web ASP.Net
Lorsque vous tentez d'un objet dans une Action d'un Contrôleur, il sporadiquement semble être null. J'ai découvert que c'est dû à la ReadAsStringAsync()
dans le SendAsync()
remplacement de la DelegatingHandler
. Le problème est avec le contenu. Quand mon client envoie un contenu en corps et en lecture de l'enregistreur de données, il n'est jamais lu par le Contrôleur de l'Action de l'Appelant (ou peut-être quelque part dans le JsonFormatter
). Je soupçonne l'appel suivant à Content.ReadAsStringAsync()
ne pas lever une exception, mais aussi ne pas retourner le contenu du corps (un peu d'info est renvoyée indiquant que l'async lecture est terminée).
Mais mon problème reste le même depuis que j'ai envie de lire un [FromBody]
paramètre dans une action, et elle est nulle lorsque le RaceCondition de Content.ReadStringAsync
est remporté par le DelegatingHandler
. Lorsque JsonFormatter
gagne bien, je reçois l'objet, mais c'est rare (seulement au démarrage du service).
Voici mon DelegatingHandler
code:
public class LogHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var apiRequest = new WebApiUsageRequest(request);
WriteLog(apiRequest);
request.Content.ReadAsStringAsync().ContinueWith(t =>
{
apiRequest.Content = t.Result;
WriteLog(apiRequest);
});
return base.SendAsync(request, cancellationToken).ContinueWith(task =>
{
var apiResponse = new WebApiUsageResponse(task.Result);
apiResponse.Content = task.Result.Content != null ? task.Result.Content.ReadAsStringAsync().Result : null;
WriteLog(apiResponse);
return task.Result;
});
}
}
Quelqu'un a une idée pour trouver une solution à ce problème?
source d'informationauteur Sando
Vous devez vous connecter pour publier un commentaire.
C'est par la conception. Dans ASP.NET l'API Web le contenu du corps est traitée en un seul flux, qui ne peut être lu qu'une seule fois.
Vous pouvez essayer en utilisant ASP.NET Web suivi de l'API mais je n'ai pas tester avec une requête POST, donc je ne suis pas sûr de savoir comment/si c'est le traçage le corps de la requête (c'est le traçage des paramètres pour OBTENIR la demande de certain). Vous pouvez en lire plus ici:
ReadAsStreamAsync méthode retourne le contenu du corps.
mais si vous utilisez le code ci-dessous dans le SendAsync il fonctionne correctement
.
.
.
Cela a fonctionné pour moi:
Retourné pour moi la représentation json de mon paramètre de l'objet, afin que je puisse l'utiliser pour la gestion des exceptions et l'exploitation forestière.
Trouvé accepté de répondre à ici
Voici ce que j'ai fait:
@pirimoglu réponse de à l'aide d'une "aide" bloc ne fonctionne pas pour moi, depuis quand le lecteur est disposé, le flux sous-jacent est également fermé.