2009-04-09 29 views
14

Tôi đang gặp vấn đề với một lớp singleton tôi đang phơi bày thông qua truy cập từ xa. Trong máy chủ của tôi, tôi có:Làm việc với những người độc thân trong. Net Remoting

TcpChannel channel = new TcpChannel(Settings.Default.RemotingPort); 
ChannelServices.RegisterChannel(channel, false); 
RemotingConfiguration.RegisterWellKnownServiceType( 
    typeof(RemotableObject), "RemotableObject", 
    WellKnownObjectMode.Singleton); 

RemotableObject là một đối tượng đơn lẻ kế thừa MarshalByRefObject.

Khách hàng của tôi kết nối với nó qua:

remoteObject = (RemotableObject)Activator.GetObject(
    typeof(RemotableObject), 
    string.Format("tcp://{0}:{1}/RemotableObject", serverIP, serverPort)); 

Tất cả mọi thứ hoạt động tốt như xa như remoting đi, nhưng khi tôi truy cập vào đối tượng singleton trong mã máy chủ của tôi như thế này:

int someValue = RemotableObject.Instance.SomeDynamicValue; 

Nó truy cập một cá thể khác với các máy khách. Tôi cũng đã xác minh rằng hàm tạo riêng trong RemotableObject bị nhấn hai lần trong khi gỡ lỗi.

Tôi có thể nhận được hành vi mong muốn nếu tôi nhận được một phiên bản RemotableObject thông qua truy cập từ xa trong mã máy chủ của tôi, nhưng có cách nào để tôi có thể truy cập cùng một đối tượng như máy khách của tôi không.

Trả lời

30

Nếu tôi hiểu bạn đang làm gì, bạn muốn đối tượng sống trên máy chủ, nhưng bạn muốn tất cả các cuộc gọi của khách hàng nhận cùng một đối tượng trên máy chủ và bạn cũng muốn các cuộc gọi trong máy chủ ? mã để nhận được rằng cùng một ví dụ)

sau đó, Nếu máy chủ của bạn là "Tên máy chủ", và nó đang lắng nghe trên cổng nnnn, với Uri là "MyMsgEndpointUri", bạn đã xác định các Uri như:

var MesgUri = "tcp://ServerName:nnnn/MyMsgEndpointUri"; 

trong máy chủ của bạn, Khởi tạo điểm cuối theo:

RemotingServices.Marshal([singletonInstance], MesgURI); 

Thay vì RegisterWellKnownServiceType();

cũng vậy, trong lớp đại diện cho singleton, hãy nhớ để ghi đè lên các tài sản InitializeLifetimeService với một hoạt động vô ... hoặc đối tượng singleton sẽ nhận được rác thu thập tại một số điểm ...

public override object InitializeLifetimeService() { return (null); } 

Từ máy chủ, chỉ cần gọi phương thức tĩnh lớp singleton của bạn để có được quyền truy cập vào mà dụ singleton ... không sử dụng remoting gọi ở tất cả ...

+0

Điều đó hoạt động hoàn hảo! Cảm ơn đã phản ứng nhanh chóng! – Todd

+0

Giá trị của 'MesgURI' là gì? Kênh tcp của tôi được gọi là 'UsersTcp' và tôi đã thử với tên đó và với url:' tcp: // localhost: 5000/UserTcp' và cả hai đều cho tôi một lỗi không tìm thấy dịch vụ. – moondaisy

+0

Phải là 'tcp: // [Tên máy chủ]: [PortNumber]/MesgUri' như trong' tcp: // MYSERVERNAME: 5212/UsersTcp' –

-2

No.

Không có cách nào để đọc bộ nhớ của máy khách trong máy chủ.

-1

tôi chưa bao giờ cố gắng gọi Activator.GetObject từ phía máy chủ , nhưng điều đó sẽ trả về cùng một cá thể mà các máy khách đang sử dụng. Nhưng, bạn vẫn sẽ nhận được một proxy.

Các vấn đề liên quan