2012-04-19 6 views
1

OpenRasta에서 인코딩 된 스트림에 액세스해야 클라이언트에 전송할 필요가 있습니다. PipelineContributor를 사용하여 KnownStages.IEnd 전에 KnownStages.IOperationExecution 후에 KnownStages.AfterResponseConding 전에 시도했지만 모든 인스턴스에서 context.Response.Entity 스트림이 null 또는 비어 있습니다.OpenRasta에서 인코딩 된 스트림에 액세스

누구든지이 작업을 수행 할 수 있습니다.

또한 요청 된 코덱을 상당히 일찍 발견했지만 KnowStages.ICodecRequestSelection 이후에 등록하면 null을 반환합니다. 나는이 파이프 라인 기고 가들에 대해 뭔가를 놓치고 있다는 느낌을 받는다.

답변

1

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 줄 넘는 코드 만 입력 할 수 있습니다.이 방법은 바이트가 클라우드로 전송되기 전에 최후의 방어선이라고 생각합니다. 그것은 내에서, 당신은 기본적으로 그냥 같이 간단한 일을 할 : 당신이 대신 StringWriterIHttpEntity.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을 기반으로하지만 응용 프로그램이 어떤 형식을 사용하든 동일한 원칙이 적용됩니다.

+0

코덱을 연결할 수 있습니까? 적절한 코덱으로 인코딩 한 후에 콘텐츠를 가져와야합니다. rss 또는 atom – PlanetWilson

+0

또한 불행히도 내 엔티티는 직렬화 할 수 없으므로 너무 복잡합니다. 생각 나는 별도의 HTTP 모듈을 사용해야 할 수도 있습니다. (불쾌하지만 작동합니다. – PlanetWilson

+1

새 코덱을 만들고 미디어 유형에 등록하고 기존 코덱을 호출하여 HTTP 스트림을 가로채는 것은 매우 쉽습니다. – SerialSeb