2012-10-17 39 views
8

Tôi đang trả lại Streams từ một dịch vụ từ xa (.NET Remoting). Nhưng Streams cũng có thể xử lý như chúng ta đều biết là cần phải xử lý.Điều gì xảy ra dưới trang bìa khi bạn trả lại Luồng từ một đối tượng từ xa qua .NET Remoting

Tôi có thể gọi Dispose ở phía máy khách khi tôi đã hoàn thành việc tiêu thụ chúng. Tuy nhiên, tôi muốn biết chính xác những gì xảy ra dưới trang bìa khi tôi trả lại một Stream từ một đối tượng từ xa.

Đặc biệt:

  1. Tôi có nên đọc tốt hơn tất cả mọi thứ vào một byte[] và gửi lại rằng thay vì một Stream?
  2. Hoặc tính năng từ chối .NET có thực hiện chính xác điều đó đối với tôi trong phạm vi không?
  3. Nếu không, cách trả lại Stream khác với trả lại byte[]? Cuối cùng, .NET Remoting phải bằng cách nào đó tuần tự hóa dữ liệu?
  4. Gọi Dispose ở phía máy khách có ảnh hưởng gì không? Có bất kỳ kết nối ma thuật nào giữa đối tượng ở phía máy khách và đối tượng trên máy chủ không? Tôi nghĩ rằng một khi nó được deserialized đằng sau bao gồm, không có ý nghĩa trong việc gọi Dispose() ở phía khách hàng hoặc là có?

tôi trả lời để Mike Bild ở đây vì tôi cũng muốn cải thiện các câu hỏi một chút

Ok, vì vậy dòng nói lại cho máy chủ là (cho tôi ít nhất) bất ngờ.

Để hoặt một đối tượng từ xa người ta phải làm một cái gì đó như thế này:

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); 
    } 
} 

Vì vậy, bạn được một cách rõ ràng vươn ra cho một đối tượng từ xa cụ thể tại một số URI để tiêu thụ. Và khi một phương thức trên đối tượng từ xa đó trả về một đối tượng kế thừa từ MarshallByRefObject, điều đó có nghĩa là nó sẽ tự động được liên kết với đối tượng ở phía xa? Ok, điều đó sẽ dễ tái tạo với một đối tượng thử nghiệm mà tôi tự xây dựng. Vì vậy, điều này cũng có nghĩa là tôi nên gọi Dispose ở phía khách hàng và nó được ủy quyền trở lại đối tượng ở phía máy chủ?

+0

MarshalByRefObject nên bao giờ triển khai IDisposable để quản lý lâu dài ở phía máy khách. Có, gọi Dispose() trên phía máy khách vứt bỏ đối tượng "được chia sẻ" ở phía máy chủ. –

+0

đề xuất của tôi - triển khai IDisposable cho tất cả các loại liên quan đến các đối tượng MBR cho đến khi bạn thực hiện luồng thành bộ nhớ như mảng byte hoặc luồng mới như tệp –

+0

Ok, bạn đúng 100% :) Tôi vừa trả về một đối tượng tùy chỉnh kế thừa từ MBR và thiết lập các điểm ngắt để làm cho nó hiển thị. Tôi luôn luôn có một nhu cầu điên rồ để làm cho mọi thứ có thể nhìn thấy được :) Khía cạnh hài hước là: Tôi đã viết một ApplicationServer chung bao gồm một NotificationService hai chiều trong năm 2009 mà sẽ không thể có mà không có những thứ làm việc theo cách này. http://www.mycsharp.de/wbb2/thread.php?threadid=75670 Tôi phải quên điều đó ở giữa. Dù sao, tuyệt vời bạn đã dành thời gian để làm mới bộ não của tôi! – Christoph

Trả lời

2

Luồng là một MarshalByRefObject. Đó là một loại đặc biệt. Đó là một proxy.

  1. Bạn có thể làm việc với cả hai trong .NET Remoting
  2. Không, nó là một loại khác qua một proxy tạo - tìm kiếm thừa kế từ MarshalByRefObject
  3. http://msdn.microsoft.com/en-us/library/system.marshalbyrefobject.aspx
  4. Vâng, một ảo thuật chút ít hơn lớp proxy