WCF에서 반환 값으로 스트리밍 - 누가 처리합니까?
다음 WCF 구현이 있다고 가정해 보겠습니다.
public Stream Download(string path)
{
FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
return stream;
}
반환된 값을 처리하는 책임은 누구에게 있습니까? 결국 네트워크 장애가 발생할 수 있으므로 소비자가 이를 처리하지 못할 수 있습니다.
서비스는 스트림을 닫을 책임이 있으며 기본 동작을 변경하지 않는 한 자동으로 수행합니다 ( 기본값이 있는 동작 이 항상 사용됨). 사용자가 설정 한 경우 OperationBehavior.AutoDisposeParameters
에 false
당신을위한 핸들러를 등록해야합니다 OperationContext.OperationCompleted
설명대로 핸들러에서 스트림을 폐기 여기 .
클라이언트에 다른 스트림이 있으므로 클라이언트가 스트림을 닫을 수 없습니다. 스트림에 대한 참조 또는 파일 핸들러에 대한 참조를 전달하고 있지 않습니다. 내부적으로 파일 콘텐츠는 전송을 위해 복사되고 클라이언트는 자체 스트림 인스턴스에서 이를 처리합니다.
Stream을 MessageContract로 래핑하는 경우(헤더에서 더 많은 정보를 보낼 수 있도록) Stream이 자동으로 삭제되지 않도록 주의하십시오! OperationBehavior.AutoDisposeParameters 특성의 이름에서 알 수 있듯이 WCF는 입력/출력 매개 변수를 자동으로 삭제하므로 MessageContract 클래스에서 IDisposable을 구현하고 거기에서 스트림을 닫아야 합니다.
아래와 같이 WCF에서 반환된 스트림을 삭제할 수 있습니다.
FileStream stream=null;
OperationContext clientContext = OperationContext.Current;
clientContext.OperationCompleted += (sender, args) =>
{
if (stream != null)
stream.Dispose();
};
stream = new FileStream(path, FileMode.Open, FileAccess.Read);
return stream;
ReferenceURL : https://stackoverflow.com/questions/6483320/stream-as-a-return-value-in-wcf-who-disposes-it
'IT이야기' 카테고리의 다른 글
소스에서 이벤트 ID에 대한 설명을 찾을 수 없습니다. (0) | 2021.09.28 |
---|---|
git에서 다른 사람의 프로젝트에 대한 pull 요청 병합 방법 (0) | 2021.09.27 |
레이블과 같은 줄에 입력 요소를 넣는 방법 (0) | 2021.09.27 |
Java에서 단일 스레드 복잡한 알고리즘을 측정하기 위한 최고의 매크로 벤치마킹 도구/프레임워크 (0) | 2021.09.27 |
XE2에서 COM이 손상되었을때 해결 방법 (0) | 2021.09.27 |