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

C#

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

PR

エラー内容

実行コード

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

サンプル

参考

C#プログラミング
独学に限界を感じたら、オンラインのプログラミングスクールへ...
  • Code ViIlage
      挫折させない本気のプログラミングスクール。学習継続率93.3%・卒業生800名以上。
  • DMM WEBCAMP
      働きながら自分のペース学んでエンジニア転職。無料カウンセリング満足度99%!
  • TECH CAMP
      無料カウンセリング満足度95%!本業に活かせる。キャリアアップにつながる。
  • TechAcademy
      現役エンジニアから学べるオンラインに特化したプログラミングスクール。
  • テックパートナーズカレッジ
      WEBシステム開発会社のノウハウが学べるオンラインスクール。14日無料体験有り!
  • \ PHP・Laravelに特化したオンラインスクール /
    yasuakiをフォローする
    codelikeなブログ

    コメント

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