2012-02-13 38 views
7

Tôi đang viết một ứng dụng .NET Remoting. Tôi có dll, máy chủ và máy khách của tôi đều hoạt động chính xác. Tuy nhiên, khi tôi cố gắng thay đổi lời gọi phương thức của tôi để lấy một tham số đối tượng thay vì một kiểu đơn giản như một int, nó phàn nàn với lỗi này..NET Remoting, chuyển các đối tượng vào các phương thức

Loại System.Runtime.Remoting.ObjRef và các loại từ nó (chẳng hạn như System.Runtime.Remoting.ObjRef) không được phép để được deserialized ở mức độ bảo mật này.

Phương pháp này giống như thế này.

public List<Orders> GetOrders(int UserID) { //Works 

public List<Orders> GetOrders(Users user) { // Doesnt Work 

[Serializable] 
public class Users : MarshalByRefObject { 

Bây giờ tôi cũng đã tạo lớp người dùng, [Serializable] và gán cho nó kế thừa MarshalByRefObject. Đây có phải là vấn đề của tôi không? Tôi đã cố gắng loại bỏ [Serializable] từ lớp User và nó phàn nàn vì nó không thể giải thích nó.

EDIT Ok, đây là phương pháp khách hàng của tôi.

IChannel channel = new TcpClientChannel(); 
ChannelServices.RegisterChannel(channel, false); 
CustomType Server = (CustomType)Activator.GetObject(typeof(CustomType), "tcp://localhost:9934/CustomType"); 

Đây là máy chủ của tôi.

BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider(); 
provider.TypeFilterLevel = TypeFilterLevel.Full; 
IDictionary props = new Hashtable(); 
props["port"] = 9934; 
TcpChannel channel = new TcpChannel(props, null, provider); 
ChannelServices.RegisterChannel(channel); 
RemotingConfiguration.RegisterWellKnownServiceType(typeof(CustomType), "CustomType", WellKnownObjectMode.Singleton); 
Console.WriteLine("Server is initialized"); 
Console.ReadLine(); 
+1

Các bạn đã thử bằng cách loại bỏ ' MarshalByRefObject' từ lớp Người dùng? –

+0

Tôi chưa hoàn toàn cố gắng để tôi quay lại và đảm bảo – meanbunny

+0

Khi tôi xóa MarshalByRefObject, nó không trợ giúp, cảm ơn! – meanbunny

Trả lời

2

Thực ra, .NET remoting là một công nghệ lỗi thời. Thay vào đó, bạn nên xem WCF.

Về vấn đề thực tế của bạn: Có thể ứng dụng của bạn đang chạy ở cấp độ tin cậy quá thấp.
Lớp Users nên serializable, nhưng, nếu nó không chứa bất kỳ phương pháp mà nên chạy tại máy chủ, nó không nên xuất phát từ MarshalByRefObject

+9

cho là, từ xa vẫn phục vụ việc sử dụng để nói chuyện giữa các miền AppDomain trong cùng một quy trình.Chỉ cần sayin ' –

+0

Tôi havent nhìn WCF được nêu ra, và lớp người dùng không giữ bất kỳ cuộc gọi cần thiết mà sẽ cần phải kế thừa MarshalByRefObject. Tôi đã cố gắng để đi theo con đường đơn giản và tạo ra một DLL duy nhất có thể được sử dụng cho các máy chủ và ứng dụng khách hàng thay vì tạo ra nhiều DLL. – meanbunny

+0

Vấn đề thực tế khi sử dụng công nghệ lạc hậu là có ít người nhớ đến nó hơn. Tôi chỉ vừa mới nhớ ra rằng tôi đã nhìn thấy lỗi này trước đây, nhưng không phải là cách khắc phục nó. Và tôi là _old_. –

2

Đảm bảo cả máy chủ và máy khách cấu hình thiết lập thuộc tính typeFilterLevel để Full

hoặc có lớp User của bạn thực hiện ISerializable

MSDN Documentation on .NET Remoting Serialization Security.

+0

Ok bất cứ khi nào tôi thực hiện điều này, nó mang lại cho tôi lỗi sau khi phương pháp cố gắng nhấn DB. 'Proxy từ xa này không có kênh chìm có nghĩa là máy chủ không có kênh máy chủ đã đăng ký đang nghe hoặc ứng dụng này không có kênh khách hàng phù hợp để nói chuyện với máy chủ.' – meanbunny

+0

Hãy để tôi cụ thể hơn, bất cứ khi nào nó cố truy cập Thuộc tính User.UserID nó ném ngoại lệ này. – meanbunny

+0

http://stackoverflow.com/questions/1657863/remoting-and-missing-channel-sinks – Alan

4

"không được phép bị huỷ bỏ được tuần tự hóa ở cấp độ bảo mật này. " là phần quan trọng.

Xem sau cho câu trả lời

http://www.codeproject.com/Articles/4363/NET-Remoting-in-Simple-English-Really-it-s-that-s

Đặt sau trên cả client và server:

typeFilterLevel = "Full" trong thẻ Formatter

+0

Nếu tôi không thiết lập điều này thông qua một tập tin cấu hình làm thế nào để tôi thực hiện điều này? – meanbunny

+1

Câu trả lời là ở đây: http://www.alexthissen.nl/blogs/main/archive/2007/12/23/back-to-net-remoting-typefilterlevel.aspx – Chriseyre2000

+0

Liên kết được cung cấp bị hỏng. Cái mới là https://alexthissen.wordpress.com/2007/12/23/back-to-net-remoting-typefilterlevel/ –