В java объекты генерируются в кучевой памяти. Для этого требуется, чтобы ссылка была указана и использована в нашем приложении. Ссылка имеет расположение памяти объекта, с помощью которого мы можем использовать объекты в нашем приложении. Ссылка вкратце - это не что иное, как имя переменной, в которой хранится адрес объекта, созданного в ячейке памяти.
instance
- общий термин для object
. FYI, Object
является классом.
Например,
Class A{
}
A ref = new A();
Для приведенного выше фрагмента кода ref является ссылкой для объекта класса A, сгенерированного в куче.
Хороший вопрос, я должен был испытать и видеть, мог ли я создать HttpModule, чтобы сделать то, что Вы описываете.
у меня не было удачи при попытке читать из responsestream, но использование ResponseFilter дало мне способ получить содержание.
следующий код, кажется, работает довольно хороший, и я фигурировал, возможно, что Вы могли использовать код как основу. Но помните, что это - просто что-то, что я бросил вместе быстро, это не было протестировано всегда. Не используйте его ни в какой продуктивной среде без надлежащего рассмотрения/тестирования и такого. Не стесняйтесь комментировать его хотя ;)
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
}
Один путь к сделать серверную сторону XMLHTTP запрашивает к Вашему собственному серверу. Захватите результат и сохраните его в файл или DB.
Поочередно можно использовать Ajax на клиенте, захватить результат и POST он назад к серверу.
Многие тестеры загрузки позволят Вам регистрировать сгенерированные ответы HTTP, но принимать во внимание с ASP.NET это могли быть некоторые очень большие файлы журнала.
Редактирование: Ответ. Фильтр согласно коду Tom Jelen разработан для предоставления этого вида контроля и Ответа. Outputstream в других отношениях нечитабелен.
Редактирование 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() */
//...
}
и в Вашем Page_Load (или прежде чем Ваш ответ записан так или иначе)
Response.Filter = new ObserverStream(Response.Filter);