Tôi đã tạo loại trả lại webView FileResult : IHttpActionResult
cho các cuộc gọi api của mình. FileResult tải xuống một tệp từ một url khác và sau đó trả về luồng cho máy khách.HttpClient trong sử dụng tuyên bố nguyên nhân Công việc bị hủy
Ban đầu mã của tôi đã có một tuyên bố using
như dưới đây:
public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
try
{
HttpResponseMessage response;
using (var httpClient = new HttpClient())
{
response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new System.Net.Http.StreamContent(
await httpClient.GetStreamAsync(this.filePath))
};
}
return response;
}
catch (WebException exception)
{...}
}
Tuy nhiên điều này không liên tục sẽ gây ra một TaskCanceledException
. Tôi biết rằng nếu HttpClient được xử lý trước khi cuộc gọi không đồng bộ kết thúc, trạng thái của Task sẽ thay đổi thành hủy bỏ. Tuy nhiên vì tôi sử dụng một số đang chờ trong: Content = new System.Net.Http.StreamContent(await httpClient.GetStreamAsync(this.filePath))
nên ngăn không cho HttpClient bị loại bỏ ở giữa nhiệm vụ hoàn thành.
Tại sao tác vụ đó bị hủy? Nó không phải là do một thời gian chờ vì điều này đã xảy ra trên các yêu cầu nhỏ nhất và không phải luôn luôn xảy ra trên các yêu cầu lớn.
Khi tôi xóa bảng sao kê using
mã làm việc đúng cách:
public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
try
{
HttpResponseMessage response;
var httpClient = new HttpClient();
response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new System.Net.Http.StreamContent(
await httpClient.GetStreamAsync(this.filePath))
};
return response;
}
catch (WebException exception)
{...}
}
Bất cứ ý tưởng tại sao sử dụng gây ra vấn đề này?
Bạn đã thử sử dụng trình gỡ lỗi chưa? Kiểm tra từng bước một. – kevintjuh93
Vâng tôi có. Nó không thực sự hữu ích vì ngoại lệ không được ném ở đây nhưng ở một vị trí hoàn toàn khác. Nó xảy ra trong đường ống Owin mà tôi đang sử dụng khi xác thực và nó đang chờ yêu cầu tiếp theo. – Rafi
'TaskCanceledException' có bất kỳ ngoại lệ bên trong nào không? –