سؤال

كيف يمكنني الاستيلاء على HTML (في مثلي، لتسجيل) المقدمة من صفحة ASPX؟

لا أريد أن أضطر إلى الكتابة إلى الصفحة باستخدام Response.Write، لأنه يفسر تخطيط موقعي.

باستخدام Response.OutputStream أو استجابة دفق Discut.Output في نتائج ArgumentException ({system.argumentException: Stream لم يكن مقروءا.)

هل كانت مفيدة؟

المحلول

سؤال جيد، اضطررت إلى تجربة ومعرفة ما إذا كان بإمكاني إنشاء httpmodule للقيام بما تصفه.

لم أحظي بأي حظ في محاولة القراءة من المسؤول، لكن استخدام لي استجابة أعطاني وسيلة لالتقاط المحتوى.

يبدو أن التعليمات البرمجية التالية تعمل بشكل جيد للغاية، واكسبت ربما يمكنك استخدام التعليمات البرمجية كقاعدة. لكن تذكر أن هذا مجرد شيء ألقيت فيه بسرعة، لم يتم اختباره بأي شكل من الأشكال. لذلك لا تستخدمه في أي بيئة إنتاج دون مراجعة / اختبار مناسب ومثل هذا. لا تتردد في التعليق على ذلك؛)

public class ResponseLoggerModule : IHttpModule
{
    private class ResponseCaptureStream : Stream
    {
        private readonly Stream _streamToCapture;
        private readonly Encoding _responseEncoding;

        private string _streamContent;
        public string StreamContent
        {
            get { return _streamContent; }
            private set
            {
                _streamContent = value;
            }
        }

        public ResponseCaptureStream(Stream streamToCapture, Encoding responseEncoding)
        {
            _responseEncoding = responseEncoding;
            _streamToCapture = streamToCapture;

        }

        public override bool CanRead
        {
            get { return _streamToCapture.CanRead; }
        }

        public override bool CanSeek
        {
            get { return _streamToCapture.CanSeek; }
        }

        public override bool CanWrite
        {
            get { return _streamToCapture.CanWrite; }
        }

        public override void Flush()
        {
            _streamToCapture.Flush();
        }

        public override long Length
        {
            get { return _streamToCapture.Length; }
        }

        public override long Position
        {
            get
            {
                return _streamToCapture.Position;
            }
            set
            {
                _streamToCapture.Position = value;
            }
        }

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

        public override long Seek(long offset, SeekOrigin origin)
        {
            return _streamToCapture.Seek(offset, origin);
        }

        public override void SetLength(long value)
        {
            _streamToCapture.SetLength(value);
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            _streamContent += _responseEncoding.GetString(buffer);
            _streamToCapture.Write(buffer, offset, count);
        }

        public override void Close()
        {
            _streamToCapture.Close();
            base.Close();
        }
    }

    #region IHttpModule Members

    private HttpApplication _context;
    public void Dispose()
    {

    }

    public void Init(HttpApplication context)
    {
        _context = context;

        context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
        context.PreSendRequestContent += new EventHandler(context_PreSendRequestContent);
    }

    void context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        _context.Response.Filter = new ResponseCaptureStream(_context.Response.Filter, _context.Response.ContentEncoding);
    }

    void context_PreSendRequestContent(object sender, EventArgs e)
    {
        ResponseCaptureStream filter = _context.Response.Filter as ResponseCaptureStream;

        if (filter != null)
        {
            string responseText = filter.StreamContent;

            // Logging logic here
        }
    }

    #endregion
}

نصائح أخرى

سيسمح لك العديد من اختبار الحمل بتسجيل استجابات HTTP التي تم إنشاؤها، ولكن ضع في اعتبارك مع ASP.NET تلك يمكن أن تكون بعض ملفات سجل كبيرة جدا.

تحرير: Response.Filter حسب رمز Tom Jelen مصمم لإعطاء هذا النوع من الرقابة والاستجابة.

تحرير 2: لصفحة بدلا من httpmodule

public class ObserverStream : Stream
{
  private byte[] buffer = null;
  private Stream observed = null;

  public ObserverStream (Stream s)
  {
    this.observed = s;
  }

  /* important method to extend #1 : capturing the data */
  public override void Write(byte[] buffer, int offset, int count)
  {
    this.observed.Write(buffer, offset, count);
    this.buffer = buffer; //captured!
  }

  /* important method to extend #2 : doing something with the data */
  public override void Close()
  {
    //this.buffer available for logging here!
    this.observed.Close();
  }

  /* override all the other Stream methods/props with this.observed.method() */

  //...

}

وفي صفحة_ التحميل الخاص بك (أو قبل استجابةك مكتوبة على أي حال)

Response.Filter = new ObserverStream(Response.Filter);

طريقة واحدة لجعل طلب XMLHTTP جانب الخادم إلى الخادم الخاص بك. الاستيلاء على النتيجة وحفظها إلى ملف أو DB.

بالتناوب يمكنك استخدام AJAX على العميل، والاستيلاء على النتيجة، ونشره مرة أخرى إلى الخادم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top