Web API İsteği İçeriği - yani json dizesini günlüğe kaydetmeye çalışıyorum. Bir ITraceWriter sınıfı (example) uyguladı ve Web API'sinin bunu boru hattında çağırması için yapılandırdım. Ama eğer request.Content'i okursaydım veya okumak için bir akıma kopyalamak, null modeliyle sonuçlanan yöntem için mevcut değildir. This post, bu konu hakkında biraz konuşuyor. Herkes, gelen Web API istek içeriğinin kaydını kapatarak en iyi yaklaşımın ne olduğunu biliyor mu?ASP.NET Web API Gelen İstek İsteğini Kaydetme
Teşekkür
Güncelleme A
Projemde şeyi göz ardı etmek için basit örnek Web API projesi oluşturdu ve hala modeli nedeniyle günlük sıfır olacağını görüyoruz. Fidder ile sırayla birkaç kez test ediyorum ve modelimin boş olduğunu görüyorum. Nokta kesme noktaları ile çalışabilir, bu yüzden bir senkronizasyon/zamanlama sorunu olduğunu düşünüyorum. Bunu nasıl çalıştıracağınıza dair herhangi bir düşünce var mı?
Başlık:
User-Agent: Fiddler
Host: localhost:56824
Content-Type: application/json
Content-Length: 22
Gövde:
Kontrolör:
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!");
}
}
}
Modeli:
0 Burada{
"A":1,"B":"test"
}
kod
public class ValuesModel
{
public int A { get; set; }
public string B { get; set; }
}
Kaydedici:
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;
}
}
WebApiConfig sınıfında Kablolama yukarı logger:
config.MessageHandlers.Add(new APITraceLogger());
Güncelleme B ben logger değiştirmek eğer şimdi çalışıyor gibi görünüyor
kodu bekletme, uyumsuzluk ve sonuca geri dönme. Async kodunda ya da gerçekten bir zamanlama sorunu veya bir şey anlamıyorum bir şey gibi görünüyor.
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;
}
}
Filip tarafından bu yoruma atıldım. ReadAsStringAsync'i kullandım ve modelim boş olacaktı. İşte ITraceWriter uygulamasında kullandığım temel kod: request.Content.ReadAsStringAsync(). ContinueWith (s => { string requestText = s.Result; Logger.Log (requestText); }); – Bryan
İstediğiniz konuyu yeniden sunamıyorum. Örneğin (bunu yapmanın en iyi yolu değil), Mike Wasson örneğinden SimpleTracer'ın WriteTrace yönteminde aşağıdaki kodu kullanıyorum: if (rec.Request! = Null) {Console.WriteLine (rec.Category + "," + rec.Request.Content.ReadAsStringAsync() Sonuç.); } –
Tekrar denenmeye çalıştığınız için teşekkürler. Neyin farklı olduğunu anlamaya çalışıyorum. MVC 4 kullanıyorum ve yerel dev için IIS Express'te çalışıyorum. Belki de IIS Express farkıdır. Farklı bir şey deniyorum ve geri göndereceğim. – Bryan