[Azure Functions][C#]HttpRequestのBodyを2回読んだらエラーになった

C#

Azure Functionで、リクエストのBodyを複数回読み込もうとしたらエラーになったので対処法を調べました。

エラー内容

実行コード

var userRequest = new User();
using (var sr = new StreamReader(req.Body))
{
    userRequest = JsonConvert.DeserializeObject<User>(await sr.ReadToEndAsync());
}

var homeRequest = new Home();
using (var sr = new StreamReader(req.Body))
{
    homeRequest = JsonConvert.DeserializeObject<Home>(await sr.ReadToEndAsync());
}

上記のようにreq.Body(HttpRequest)を2回読んだときに出ていました。

エラーメッセージ

エラーの内容としては、下記のような感じで、破棄されたオブジェクトにアクセスできないというメッセージが表示されました。

System.Private.CoreLib: Exception while executing function: HttpRequestTwoAccess. Microsoft.AspNetCore.WebUtilities: Cannot access a disposed object.
Object name: 'FileBufferingReadStream'.

対策

下記のようにStreamReaderでバッファサイズ指定して、
Seekを最初に戻すと、エラーが解消しました。原因は最後まで行ってオブジェクトが破棄されてたってことみたいです・・・🤔

var userRequest = new User();
using (var sr = new StreamReader(req.Body, Encoding.UTF8, true, 1024, true))
{
    userRequest = JsonConvert.DeserializeObject<User>(await sr.ReadToEndAsync());
}
req.Body.Seek(0, SeekOrigin.Begin);

var homeRequest = new Home();
using (var sr = new StreamReader(req.Body, Encoding.UTF8, true, 1024, true))
{
    homeRequest = JsonConvert.DeserializeObject<Home>(await sr.ReadToEndAsync());
}
req.Body.Seek(0, SeekOrigin.Begin);

サンプル

参考

コメント

タイトルとURLをコピーしました