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:
- 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ộtStream
? - 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?
- Nếu không, cách trả lại
Stream
khác với trả lạibyte[]
? Cuối cùng,.NET Remoting
phải bằng cách nào đó tuần tự hóa dữ liệu? - 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ọiDispose()
ở 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ủ?
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ủ. –
đề 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 –
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