Codec
(실제로는 쉽습니다)을 쓰지 않고 브라우저의 실제 스트림을 가져 오는 방법을 알지 못합니다. 이 작업을 수행하는 방법은 IResponseCoding
알려진 단계 전에 ICommunicationContext.Response.Entity
을 직렬화하는 것입니다. 의사 코드 :
class ResponseLogger : IPipelineContributor
{
public void Initialize(IPipeline pipelineRunner)
{
pipelineRunner
.Notify(LogResponse)
.Before<KnownStages.IResponseCoding>();
}
PipelineContinuation LogResponse(ICommunicationContext context)
{
string content = Serialize(context.Response.Entity);
}
string Serialize(IHttpEntity entity)
{
if ((entity == null) || (entity.Instance == null))
return String.Empty;
try
{
using (var writer = new StringWriter())
{
using (var xmlWriter = XmlWriter.Create(writer))
{
Type entityType = entity.Instance.GetType();
XmlSerializer serializer = new XmlSerializer(entityType);
serializer.Serialize(xmlWriter, entity.Instance);
}
return writer.ToString();
}
}
catch (Exception exception)
{
return exception.ToString();
}
}
}
이 ResponseLogger
은 일반적인 방법으로 등록 :
언급 한 바와 같이
ResourceSpace.Uses.PipelineContributor<ResponseLogger>();
, 이것은 반드시 당신에게 브라우저로 보내 정확한 바이트 스트림을 제공하지 않습니다, 그러나 그것은 충분히 가까운 브라우저에 전송되는 바이트 스트림은 기본적으로 동일한 직렬화 된 엔티티이므로 내 필요에 따라
자신의 코덱을 작성하면 IMediaTypeWriter.WriteTo()
메쏘드에 100 줄 넘는 코드 만 입력 할 수 있습니다.이 방법은 바이트가 클라우드로 전송되기 전에 최후의 방어선이라고 생각합니다. 그것은 내에서, 당신은 기본적으로 그냥 같이 간단한 일을 할 : 당신이 대신 StringWriter
에 IHttpEntity.Stream
쓰기에 직접 작성하고 그것을 ToString()
을, 당신은 직렬화 된 개체를해야하는 경우
public void WriteTo(object entity, IHttpEntity response, string[] parameters)
{
using (var writer = XmlWriter.Create(response.Stream))
{
XmlSerializer serializer = new XmlSerializer(entity.GetType());
serializer.Serialize(writer, entity);
}
}
당신이 로그인 할 수있는 출력 스트림에 쓰기 전에 원하는대로 처리하십시오.
위 예제 코드는 모두 XML serialization 및 deserialization을 기반으로하지만 응용 프로그램이 어떤 형식을 사용하든 동일한 원칙이 적용됩니다.
코덱을 연결할 수 있습니까? 적절한 코덱으로 인코딩 한 후에 콘텐츠를 가져와야합니다. rss 또는 atom – PlanetWilson
또한 불행히도 내 엔티티는 직렬화 할 수 없으므로 너무 복잡합니다. 생각 나는 별도의 HTTP 모듈을 사용해야 할 수도 있습니다. (불쾌하지만 작동합니다. – PlanetWilson
새 코덱을 만들고 미디어 유형에 등록하고 기존 코덱을 호출하여 HTTP 스트림을 가로채는 것은 매우 쉽습니다. – SerialSeb