Tôi đang sử dụng Webjob với SDK lưu trữ Windows Azure. Khi một mục mới xuất hiện trong một Hàng đợi, một phương thức trong lớp của tôi được gọi. Theo số SDK docs, nếu tôi lấy TextWriter làm tham số cho phương thức của mình, SDK sẽ cung cấp cho tôi một TextWriter mà tôi có thể viết để hiển thị trong cơ sở hạ tầng ghi nhật ký của Webjob. Điều này làm cho nó khá dễ dàng để chẩn đoán các vấn đề và khắc phục sự cố.Azure Webjob TextWriter logger đang được xử lý ở giữa phương pháp của tôi
public async static void ProcessQueueMessage([QueueTrigger("queueName")]MyModelType model, TextWriter logger)
{
await logger.WriteLineAsync(string.Format("Processing Item {0}", model.SasUrl));
// Some work here
await logger.WriteLineAsync(string.Format("Done Processing Item {0}", model.SasUrl));
}
Tuy nhiên, rất thường xuyên, trong nội dung phương pháp của tôi, TextWriter đang được xử lý. Tôi nhận được ngoại lệ sau đây vào ngày 2 logger.WriteLineAsync:
System.ObjectDisposedException was unhandled by user code
HResult=-2146232798
Message=Cannot write to a closed TextWriter.
Source=mscorlib
ObjectName=""
StackTrace:
at System.IO.__Error.WriterClosed()
at System.IO.StringWriter.Write(Char[] buffer, Int32 index, Int32 count)
at System.IO.TextWriter.WriteLine(String value)
at System.IO.TextWriter.SyncTextWriter.WriteLine(String value)
at System.IO.TextWriter.SyncTextWriter.WriteLineAsync(String value)
at NameOfProject.Program.<ProcessQueueMessage>d__8.MoveNext() in c:\Dev\Path\To\Program.cs:line 173
InnerException:
tôi không thể tìm thấy người khác gặp phải vấn đề này, vì vậy tôi không thể tưởng tượng có một lỗi trong SDK hoặc webjobs cơ sở hạ tầng.
Có cách nào để biết liệu nhật ký có được xử lý trước cuộc gọi không?
Có cách nào để tạo trình ghi nhật ký mới trong phương thức của tôi sẽ tham gia vào hệ thống con đăng nhập WebJob và giao diện người dùng không?
Không có gì hiển nhiên đối với tôi, nhưng tôi đoán đó có thể là vấn đề không đồng bộ. Có nhiều lỗi trường hợp góc có thể xảy ra với các ứng dụng giao diện điều khiển tĩnh rỗng không đồng bộ. Bạn có thể thử thả async và nhìn thấy nếu nó repros vẫn? –
Có lý do cụ thể nào để sử dụng async đang đợi bên trong trình xử lý WebJob không? Theo hiểu biết của tôi, công việc web của bạn sẽ được gọi trong một chủ đề khác với chủ đề chính của SDK. Vì vậy, chủ đề chính sẽ không bao giờ bị quấy rầy. –