Tôi đang cố gắng đăng xuất Nội dung Yêu cầu API Web - tức là chuỗi json. Tôi đã triển khai một lớp ITraceWriter (example) và cấu hình nó để Web API gọi nó trong đường dẫn. Nhưng nếu tôi đọc request.Content hoặc sao chép vào một dòng để đọc nó không có sẵn cho phương thức dẫn đến một mô hình null. This post nói về vấn đề đó một chút. Bất kỳ ai có kinh nghiệm đăng xuất nội dung yêu cầu API Web trong nước và biết cách tiếp cận tốt nhất là gì?Đăng nhập API Web ASP.NET Đăng nhập Nội dung Yêu cầu Nội dung
Cảm ơn
Cập nhật Một
Tôi tạo ra một dự án Web API mẫu đơn giản để loại trừ bất cứ điều gì trong dự án của tôi và tôi vẫn thấy rằng mô hình sẽ được null vì khai thác gỗ. Tôi chỉ cần kiểm tra một vài lần liên tiếp bằng cách đăng thông qua Fidder và xem mô hình của tôi có giá trị rỗng. Với breakpoint tại chỗ, nó có thể làm việc đó là lý do tại sao tôi nghĩ rằng có một vấn đề đồng bộ/thời gian. Bất kỳ suy nghĩ về cách để có được điều này để làm việc?
Tiêu đề:
User-Agent: Fiddler
Host: localhost:56824
Content-Type: application/json
Content-Length: 22
Body:
{
"A":1,"B":"test"
}
Dưới đây là các mã:
Bộ điều khiển:
public class ValuesController : ApiController
{
[HttpPost]
public void Post(ValuesModel model)
{
if (model == null)
{
Debug.WriteLine("model was null!");
}
else
{
Debug.WriteLine("model was NOT null!");
}
}
}
mẫu:
public class ValuesModel
{
public int A { get; set; }
public string B { get; set; }
}
Logger:
public class APITraceLogger : DelegatingHandler
{
protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
if (request.Content != null)
{
// This can cause model to be null
request.Content.ReadAsStringAsync().ContinueWith(s =>
{
string requestText = s.Result;
Debug.WriteLine(requestText);
});
// and so can this
//request.Content.ReadAsByteArrayAsync()
// .ContinueWith((task) =>
// {
// string requestText = System.Text.UTF8Encoding.UTF8.GetString(task.Result);
// Debug.WriteLine(requestText);
// });
}
// Execute the request, this does not block
var response = base.SendAsync(request, cancellationToken);
// TODO:
// Once the response is processed asynchronously, log the response data
// to the database
return response;
}
}
Dây lên logger trong lớp WebApiConfig:
config.MessageHandlers.Add(new APITraceLogger());
Cập nhật B
Nó có vẻ như nó đang làm việc nếu tôi thay đổi logger đến đoạn mã sau thêm sự chờ đợi, không đồng bộ và trả về kết quả. Có vẻ như một cái gì đó tôi không hiểu trong mã async hoặc thực sự là một vấn đề thời gian hoặc một cái gì đó.
public class APITraceLogger : DelegatingHandler
{
protected async override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
if (request.Content != null)
{
// This does seem to work - is it because it is synchronous? Is this a potential problem?
var requestText = await request.Content.ReadAsStringAsync();
Debug.WriteLine(requestText);
}
// Execute the request, this does not block
var response = base.SendAsync(request, cancellationToken);
// TODO:
// Once the response is processed asynchronously, log the response data
// to the database
return response.Result;
}
}
Tôi bị Filip đưa ra nhận xét đó. Tôi đã sử dụng ReadAsStringAsync và mô hình của tôi sẽ là rỗng. Đây là mã cơ bản tôi đã sử dụng trong triển khai ITraceWriter: request.Content.ReadAsStringAsync(). ContinueWith (s => { chuỗi requestText = s.Result; Logger.Log (requestText); }); – Bryan
Tôi không thể repro vấn đề bạn đang đề cập đến. Ví dụ (không phải cách tốt nhất để làm điều đó), tôi có đoạn mã sau trong phương thức WriteTrace của SimpleTracer từ mẫu của Mike Wasson: if (rec.Request! = Null) {Console.WriteLine (rec.Category + "," + rec.Request.Content.ReadAsStringAsync(). Kết quả); } –
Cảm ơn bạn đã cố gắng để repro. Cố gắng tìm ra những gì khác biệt. Tôi đang sử dụng MVC 4 và chạy trong IIS Express cho dev địa phương của tôi. Có lẽ IIS Express là sự khác biệt. Tôi đang thử một thứ khác và sẽ đăng lại. – Bryan