2012-10-17 6 views
8

원격 서비스 (.NET Remoting)에서 Streams을 반환합니다. 그러나 Streams은 또한 우리 모두가 알고있는 것처럼 폐기 처분됩니다..NET Remoting을 통해 원격 객체에서 Stream을 반환 할 때 커버 아래에 발생하는 일

소비가 끝나면 클라이언트 측에서 Dispose으로 전화 할 수 있습니다. 그러나 원격 객체에서 Stream을 반환 할 때 정확히 무엇이 커버 아래에 발생하는지 알고 싶습니다.

특히 :

  1. 나는 더 나은 byte[]에 모든 것을 읽어야하고는 Stream 대신 반환?
  2. 또는 .NET Remoting이 나를 위해 그 일을 처리하고 있습니다.
  3. 그렇지 않은 경우 Stream과 다른 반환은 byte[]과 어떻게 다른가요? 결국 .NET Remoting은 어쨌든 데이터를 직렬화해야합니다?
  4. 클라이언트 측에서 Dispose을 호출해도 아무런 영향이 없습니까? 클라이언트 측의 객체와 서버 측의 객체간에 마 법적 연결이 있습니까? 일단 커버리지 뒤에서 역 직렬화가되면 클라이언트 측에서 Dispose()을 호출하는 것은 의미가 없습니까? 나는 또한 질문 좋아 조금

    을 개선하기 원하기 때문에

는 여기 마이크 빌트에 응답, 그래서 다시 서버에 이야기 흐름은 (나를 위해 적어도) 예기치입니다.

public static class ServiceFactory <T> { public static T CreateProxy() { Type interfaceType = typeof(T); string uri = ApplicationServer.ServerURL + interfaceType.FullName; return (T)Activator.GetObject(interfaceType, uri); } } 

그래서 당신은 명시 적으로 소비하는 몇 가지 URI에서 특정 원격 객체를 위해 밖으로 도달하고 있습니다 :

은 하나 같이 뭔가를 가지고있는 원격 객체를 cosume합니다. 그리고 그 원격 객체에 대한 메소드가 MarshallByRefObject로부터 상속받은 객체를 반환하면 자동으로 그 객체가 원격 객체의 객체와 연관되어 있음을 의미합니까? 좋아, 그건 내가 만든 테스트 객체로 재현하기 쉽다. 그래서 이것은 또한 클라이언트 측에서 Dispose를 호출해야한다는 것을 의미하며, 서버 측의 객체로 다시 프록시됩니다.

+0

MarshalByRefObject는 클라이언트 측에서 수명 관리를 위해 IDisposable을 구현해야합니다. 예, 클라이언트 쪽에서 Dispose()를 호출하면 서버 쪽에서 "공유"개체가 삭제됩니다. –

+0

내 추천 - 바이트 배열 또는 파일과 같은 새 스트림과 같은 스트림을 구체화 할 때까지 MBR 개체와 관련된 모든 유형의 IDisposable 구현 –

+0

좋아, 100 % 맞음 :) 방금 상속 된 사용자 지정 개체를 반환했습니다. MBR에서 중단 점을 설정하여 표시되도록합니다. 재미있는 부분은 다음과 같습니다. 2009 년에 양방향 NotificationService를 포함하여 일반적인 ApplicationServer를 작성했습니다.이 방법으로 작업하지 않으면 불가능합니다. http://www.mycsharp.de/wbb2/thread.php?threadid=75670 나는 그것을 잊어 버린 것 같다. 어쨌든, 당신은 내 두뇌를 새로 고칠 시간을 가졌습니다. – Christoph

답변

2

스트림은 MarshalByRefObject입니다. 특별 한 종류입니다. 그것은 프록시입니다.

  1. 당신은 모두와 .NET 원격에서 작업 할 수
  2. 아니, 그건 생성 된 프록시를 통해 다른 종류의 - 예를 에서 상속을 통해 약간의 마법을
  3. http://msdn.microsoft.com/en-us/library/system.marshalbyrefobject.aspx
  4. MarshalByRefObject를 봐 프록시 클래스