SORU
24 HAZİRAN 2009, ÇARŞAMBA


Günlük ham HTTP ASP.NET /yanıt MVC & IIS7 isteği

Yazıyorum bir web servisi (kullanarak ASP.NET MVC) ve destek amaçlı istediğimiz gibi yapabilmek için günlük istek ve yanıt olarak, mümkün olduğunca yakın ham, Tel biçimi (.bir veritabanına HTTP yöntemi de dahil olmak üzere e, yol, tüm başlıkları ve gövde).

Ben en azından bu veri tutmak nasıl emin''. karıştırılmış ne değilim Ben yeniden teşkil bence istek gibi görünüyor inceleyerek tüm özellikleri HttpRequest nesne ve bir bina dize onları (ve benzer yanıtı) ama gerçekten gelmek isterim tut gerçek istek/yanıt verilerini bu gönderilen Tel.

Filtreler, modülleri, vb gibi herhangi bir durdurma mekanizması kullanmak için mutluyum. ve çözüm IIS7 için özel olabilir. Ancak, yalnızca yönetilen kod içinde kalmasını tercih ederim.

Herhangi bir öneriler?

Düzenleme:Ben not HttpRequest SaveAs yöntemi kurtarabilir isteğine disk yeniden yapılandırır ama bu isteğin iç durumu kullanarak bir yük iç yardımcı yöntemleri erişilemiyor kamuya (tam olarak neden bu değil izin tasarrufu için kullanıcı tarafından sağlanan akış bilmiyorum). Benim en iyi nesneleri... inilti tepki text/isteği yeniden yapmak zorunda kalacağım gibi görünüyor.

Edit 2:Lütfen bu söylediğimi unutmayıntümistek yöntemi, yolu, başlıkları vb. Geçerli yanıtları sadece bu bilgileri içermeyen vücut akışları bak.

Edit 3:- Kimse soru okuyor mu? Beş cevaplar şimdiye kadar ve henüz bir tane bile bir şekilde kablolu tüm ham isteği almak için ipuçları. Evet, çıkış akışları ve başlıkları ve URL ve isteğin şeyler nesne tüm çekim yapabileceğimi biliyorum. Ben zaten soruyu, bakın. " dedi

Ben yeniden teşkil bence istek gibi görünüyor inceleyerek tüm özelliklerini HttpRequest nesne ve bir bina dize onları (ve benzer yanıtı) ama gerçekten gelmek isterim tut gerçek istek/yanıt verilerini bu gönderilen Tel.

Eğer biliyorsanıztamamlayınham veri (dahil olmak üzere başlıkları, url, http yöntemi, vb.) sadece bilmek faydalı olurdu o zaman alınamıyor. Eğer raw biçimi (evet, ben hala başlıkları, url, http yöntemi, vb.) almak için nasıl biliyorsanız aynı şekilde bunu yeniden oluşturmak zorunda kalmadan istediğim şeyi olan, o zaman çok yararlı olacaktır. AmaHttpRequest/HttpResponse nesneleri yeniden birleştirmek bana söylemediğin yararlıdır. Biliyorum. Bunu zaten söyledim.

< / ^ hr .

Herkes bunun kötü bir fikir, ya da sınırlar ölçülebilirlik, vb olduğunu söyleyerek başlamadan Önce lütfen dikkat: ayrıca, dağıtılmış bir ortamda, sıralı teslimat ve önleme mekanizmaları azaltma uyguluyor olacağız, veritabanı günlüğü zaten gereklidir. Bu iyi bir fikir olup olmadığına dair bir tartışma aramıyorum, nasıl yapılacağını arıyorum.

CEVAP
24 Kasım 2009, Salı


Kesinlikle IHttpModule kullanma ve BeginRequest EndRequest olayları uygulamak.

"Veri HttpRequest arasında mevcut ve HttpResponse, sadece tek bir raw biçiminde değil. "ham tüm Burada parçaları Fiddler tarzı döker (alır gibi çiğ HTTP için en yakın) kurmak için gerekli:

request.HttpMethod   " "   request.RawUrl   " "   request.ServerVariables["SERVER_PROTOCOL"]
request.Headers // loop through these "key: value"
request.InputStream // make sure to reset the Position after reading or later reads may fail

Cevap için:

"HTTP/1.1 "   response.Status
response.Headers // loop through these "key: value"

Unutmayınyapamazsınız yanıt akışı okuyunÇıkış akışı için bir filtre ekleyin ve bir kopyasını ele geçirmek gerekir.

Senin BeginRequest, yanıt filtresi eklemek gerekir:

HttpResponse response = HttpContext.Current.Response;
OutputFilterStream filter = new OutputFilterStream(response.Filter);
response.Filter = filter;

Bunu nereden filter EndRequest işleyicisi içinde saklayın. HttpContext.Items öneririm. Daha sonra filter.ReadStream() tam yanıt verileri alabilir.

Ardından OutputFilterStream bir kapsayıcı bir stream: Dekoratör desen kullanarak uygulamak

/// <summary>
/// A stream which keeps an in-memory copy as it passes the bytes through
/// </summary>
public class OutputFilterStream : Stream
{
    private readonly Stream InnerStream;
    private readonly MemoryStream CopyStream;

    public OutputFilterStream(Stream inner)
    {
        this.InnerStream = inner;
        this.CopyStream = new MemoryStream();
    }

    public string ReadStream()
    {
        lock (this.InnerStream)
        {
            if (this.CopyStream.Length <= 0L ||
                !this.CopyStream.CanRead ||
                !this.CopyStream.CanSeek)
            {
                return String.Empty;
            }

            long pos = this.CopyStream.Position;
            this.CopyStream.Position = 0L;
            try
            {
                return new StreamReader(this.CopyStream).ReadToEnd();
            }
            finally
            {
                try
                {
                    this.CopyStream.Position = pos;
                }
                catch { }
            }
        }
    }


    public override bool CanRead
    {
        get { return this.InnerStream.CanRead; }
    }

    public override bool CanSeek
    {
        get { return this.InnerStream.CanSeek; }
    }

    public override bool CanWrite
    {
        get { return this.InnerStream.CanWrite; }
    }

    public override void Flush()
    {
        this.InnerStream.Flush();
    }

    public override long Length
    {
        get { return this.InnerStream.Length; }
    }

    public override long Position
    {
        get { return this.InnerStream.Position; }
        set { this.CopyStream.Position = this.InnerStream.Position = value; }
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        return this.InnerStream.Read(buffer, offset, count);
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        this.CopyStream.Seek(offset, origin);
        return this.InnerStream.Seek(offset, origin);
    }

    public override void SetLength(long value)
    {
        this.CopyStream.SetLength(value);
        this.InnerStream.SetLength(value);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        this.CopyStream.Write(buffer, offset, count);
        this.InnerStream.Write(buffer, offset, count);
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Benjamin Heckendorn

    Benjamin Hec

    4 Mayıs 2008
  • HowToBasic

    HowToBasic

    8 Aralık 2011
  • krotoflik

    krotoflik

    26 ŞUBAT 2011