繁体   English   中英

传递实体框架生成的对象时的.net远程处理

[英].net remoting when passing an entity framework generated object

我对.net远程处理有问题(是的,这是我第一次尝试使用它,所以很抱歉,如果这是一个简单的解决方案,它是一个愚蠢的问题),我已经搜索了两天,可以吗?找不到解决我问题的方法,因此,如果我以某种方式错过答案,我会向您道歉。

我正在使用以下代码构建服务器/客户端系统:

服务器:

public Server() {
    DbConnector db = new DbConnector();

    BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
    provider.TypeFilterLevel = TypeFilterLevel.Full;
    IDictionary props = new Hashtable();
    props["port"] = DbConnector.PORT;
    TcpChannel channel = new TcpChannel(props, null, provider);

    ChannelServices.RegisterChannel(channel, true);
    RemotingConfiguration.RegisterWellKnownServiceType(
       typeof(DbConnector), "test",
       WellKnownObjectMode.SingleCall);
}

客户:

public Form1() {
    InitializeComponent();

    BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
    provider.TypeFilterLevel = TypeFilterLevel.Full;
    IDictionary props = new Hashtable();
    props["port"] = 0;
    props["ip"] = DbConnector.IP;
    TcpChannel channel = new TcpChannel(props, null, provider);

    ChannelServices.RegisterChannel(channel, true);
    db = (DbConnector)Activator.GetObject(typeof(DbConnector), "tcp://188.x.x.x/test");
    InitRest();
}

每当我在本地尝试使用本地主机(同时使用localhost IP和WAN IP)时,一切都可以正常工作,但是一旦在单独的计算机上尝试,客户端就会抛出异常。

{System.Net.Sockets.SocketException (0x80004005): A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 192.168.0.100:9090

Server stack trace: 
   ved System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   ved System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
   ved System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket(EndPoint ipEndPoint)
   ved System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket()
   ved System.Runtime.Remoting.Channels.RemoteConnection.GetSocket()
   ved System.Runtime.Remoting.Channels.SocketCache.GetSocket(String machinePortAndSid, Boolean openNew)
   ved System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.SendRequestWithRetry(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream)
   ved System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
   ved System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)

Exception rethrown at [0]: 
   ved ECTunes.Database_Reader.Form1.InitRest() i d:\Dropbox\visual studio 2012\Projects\ECTunes\Database Communicator v0.2\Database Reader\Form1.cs:linje 69
   ved ECTunes.Database_Reader.Form1..ctor() i d:\Dropbox\visual studio 2012\Projects\ECTunes\Database Communicator v0.2\Database Reader\Form1.cs:linje 56
   ved ECTunes.Database_Reader.Program.Main() i d:\Dropbox\visual studio 2012\Projects\ECTunes\Database Communicator v0.2\Database Reader\Program.cs:linje 16
   ved System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   ved System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   ved Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   ved System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   ved System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   ved System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   ved System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   ved System.Threading.ThreadHelper.ThreadStart()}

每当调用DbConnector的构造函数时,我都会打印出文本,我可以看到客户端与服务器联系,但我对此感到困惑。

经过更多测试后,问题似乎不在于连接本身,而是当我调用一个函数时,该函数从系统的实体框架部分返回一个生成代码的对象。 我已经用[Serializable]和:MarshalByRefObject修改了类,如下所示:

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Database
{
    using System;
    using System.Collections.Generic;

    [Serializable]
    public partial class customer: MarshalByRefObject
    {
        public customer()
        {
            this.car = new HashSet<car>();
        }

        public int customerId { get; set; }
        public string name { get; set; }

        public virtual ICollection<car> car { get; set; }
    }
}

但是,当客户端程序调用返回“客户”对象的函数并尝试访问该对象时,客户端会抛出上述异常。

我的猜测是,由于该类是从MarshalByRefObject派生的,因此回调部分实在令人费解。

我也尝试将特定端口用于客户端通道,但无济于事。

我希望有人对此有一个解决方案,最后可能只是我缺少关键部分。

我想我找到了,这要感谢您提供的样品!

ChannelServices.RegisterChannel(channel, true);

将sureSecurity设置为false

ChannelServices.RegisterChannel(channel, false);

我确实通过为对象创建包装类并将其用于传输来解决此问题。 还有更多工作,但是可以。 显然,您不应该能够通过这些渠道发送实体框架生成的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM