2017-12-02 5 views
0

私はリクエストからコンテンツを読み込んだExceptionFilterを持っています。Stream.PositionはDisposedObjectExceptionをスローします。何を確認しますか?

突然ストリームの位置をリセットしようとすると、例外がスローされます。

私はちょっと疑問に思っています。ストリームをコピーするか、他に何かを知っておく必要があるかどうか疑問に思います。

私は他の場所でストリームから読んでいません。

"exceptionMessage": "Cannot access a disposed object.", 
    "exceptionType": "System.ObjectDisposedException", 
    "stackTrace": " at System.Web.Http.WebHost.SeekableBufferedRequestStream.set_Position(Int64 value)\r\n at System.Net.Http.DelegatingStream.set_Position(Int64 value)\r\n 

アップデート2:例外フィルタの

全コード:

public override async Task OnExceptionAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken) 
    { 
     //helper for request specific data 
     var requestContentReader = new RequestContentReader(actionExecutedContext); 

     //build up error log message 
     var logMessage = "REQUEST CONTENT: "; 
      logMessage += Environment.NewLine; 
      logMessage += await requestContentReader.RequestContentAsync(); 
      logMessage += Environment.NewLine; 
      logMessage += "REQUEST URI: "; 
      logMessage += actionExecutedContext.ActionContext.RequestContext.Url.Request.RequestUri.ToString(); 

     //Log error to database 
     var logId = API.Logging.Logger.Log(logMessage, actionExecutedContext.Exception); 

     //Create response to client and display requestid 
     actionExecutedContext.Response = new HttpResponseMessage() 
     { 
      Content = new StringContent($"An error occured in the application, your Error identifier is {logId}", System.Text.Encoding.UTF8, "text/plain"), 
      StatusCode = System.Net.HttpStatusCode.InternalServerError 
     }; 

     #if DEBUG 
      throw actionExecutedContext.Exception; 
     #endif 
    } 
} 
+0

例外からどのようなエラーメッセージを受け取りましたか? –

+0

オリジナルの投稿にエラーがあります。 – user3633222

+0

非同期/待機なしで試してみてください。 –

答えて

2

は、ストリームをコピーしてください。それはトリックを行う必要があります。

 using (var ms = new MemoryStream()) 
     { 
      await _actionExecutedContext.Request.Content.CopyToAsync(ms); 
      try 
      { 
       ms.Position = 0; 
       using (var reader = new StreamReader(ms)) 
        return reader.ReadToEnd(); 
      } 
      catch (ObjectDisposedException exception) 
      { 
       return $"Stream in RequestContentAsync is unreadable. {exception}"; 
      } 

     } 
関連する問題