2014-06-18 2 views
1

질문하는 방법을 잘 모르겠지만 정교하게하기 위해 ASP.Net 웹 API 2 프로젝트에서 AWS SDK를 사용하고 있으며 S3 객체에 대한 응답 스트림을 반환하려고합니다. 스트림이 클라이언트에게 전달 된 다음 처리됩니다.하위 속성을 캡처 한 경우 상위 개체가 범위를 벗어납니다. 하위 속성을 언제 처리합니까?

내가 확신 할 수없는 사실은 S3에 대한 내 참조가 AWS와 종속 관계를 분리하기 위해 객체로 추상화된다는 것입니다. 내 파일 저장소 내에서 ResponseStream 속성을 포함하는 S3Response 개체를 검색합니다. S3Response 개체가 처리되면 그 밑에는 ResponseStream이 처리됩니다. IFileStoreStream 만 반환하며, 그 다음 패키지로 작성하여 StreamContent으로 API에서 반환합니다.

내가 FileStore.GetFile(...) 전화를 감안할 때 그리고 그것은 ResponseStream 속성 값을 반환하고 ResponseStream는 범위를 벗어나, 내가 Dispose 잠재적 전에 정상 GC 동작하는 동안 부모에 의해 ResponseStream 객체에서 호출 될 것이라는 의심을 HTTP 응답이 완료되었습니다.

S3을 추상화 된 상태로 유지하고 HTTP 응답이 완료되면 응답 스트림 만 처리되도록하려면 어떻게해야합니까?

내가 할 수있는 한 가지 방법은 을 기본 스트림의 프록시로 구현하는 일반 컨테이너 객체에 전체 S3 응답 객체를 패키징하여 내 API 메소드에서 StreamContent을 반환 한 다음 Dispose 메소드는 프레임 워크가 자연스럽게 프로세스의 끝에서 Dispose를 호출 할 때 전체 S3 응답 객체를 처리합니다. 비록 그것을 할 더 좋은 방법이 있는지 확실하지 않습니다.

+2

나는 이것을 위해'PushStreamContent'를 사용해야한다고 생각합니다 : http://weblogs.asp.net/andresv/asynchronous-streaming-in-asp-net-webapi – Noseratio

+1

네, 고마워요! @Noseratio이 답변을 추가하여 올바른 것으로 표시 할 수 있습니다. –

답변

2

PushStreamContent을 사용하여 ASP.NET 웹 API에서 클라이언트로 데이터를 스트리밍하는 것이 좋습니다. PushStreamContent은 비동기 데이터 생성 람다 (Func<Task>)를 지원하며 클라이언트는 즉시 콘텐츠 스트림 수신을 시작할 수 있습니다.

다음은 주제에 대한 훌륭한 블로그 게시물이며 일부 샘플 코드는 "Asynchronous Streaming in ASP.NET WebApi"입니다.

AWS SDK는 말할 수 없지만 AWS API에서 반환 한 스트림에서 웹 API의 클라이언트로 전송되는 스트림에 직접 비동기 적으로 데이터를 펌프 할 수 있습니다.

+1

감사합니다. 주목해야 할 점은, 소스 스트림에서 대상 스트림으로 펌프를 보내려면 stream.CopyToAsync를 사용해야한다는 것입니다. 동기화 된 버전의 메서드는 어떤 이유로 내부적으로 교착 상태 인 것처럼 보였습니다. –