zoukankan      html  css  js  c++  java
  • Remoting中向服务器传送新对象时应注意的问题

    背景:

    本人将Remoting部署在服务器了的Windows Service中,代码如下

    BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider();
                    serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
                    BinaryClientFormatterSinkProvider clientProv = new BinaryClientFormatterSinkProvider();
                    IDictionary props = new Hashtable();
                    props["port"] = 11982;
                    TcpChannel channel = new TcpChannel(props, clientProv, serverProv); 

                    ChannelServices.RegisterChannel(channel, false);
                    RemotingConfiguration.ApplicationName = "ChanceService";
                    RemotingConfiguration.RegisterActivatedServiceType(typeof(ATMemberType));


     

    ATMemberType类是一个继承自

        /// <summary>
        /// 数据访问基类。
        /// </summary>
        /// <typeparam name="E">实体类。</typeparam>
        /// <typeparam name="C">实体集合类。</typeparam>
        public abstract class BaseDataAccess<E, C> : MarshalByRefObject


    其中提供了创建实体Create(E entity),更新实体Update(E entity)等方法

            /// <summary>
            /// 创建实体。
            /// </summary>
            /// <param name="entity">实体</param>
            /// <returns></returns>
            public bool Create(E entity)
            {
                bool ret = false;
                ParameterCollection pars = data.CreateParameters();
                pars = pars.FromDataModel(entity, null, data.ParameterPrefix);
                if (data is Oracle)
                {
                    entity.SetValue(primaryKey, ((Oracle)data).GetSequence("SQ_" + entity.TableName).NextVal);
                    ret = data.ExecuteNonQuery(pars.Format("INSERT INTO " + entity.TableName + "({0}) VALUES({1})"), pars) > 0;
                }
                else if (data is SqlServer)
                {
                    int id = int.Parse(data.ExecuteScalar(pars.Format("INSERT INTO " + entity.TableName + "({0}) VALUES({1});select scope_identity() as 'id'"), pars).ToString());
                    entity.SetValue(primaryKey, id);
                    ret = id != 0;
                }
                return ret;
            }

    在客户端中,通过DA的Type激活创建了DA对象

            public static object CreateDA(Type type, object[] param)
            {
                //根据配置文件创建不同的DA类
                object Instance = null;
                string serverStr = "tcp://" + ConfigurationManager.AppSettings["Server"] + "/ChanceService";
                object[] attrs = { new UrlAttribute(serverStr) };
                Instance = Activator.CreateInstance(type, param, attrs);
                if (Instance != null)
                    return Instance;
                else throw new Exception("无法创建数据库DA对象");

             }
     

    调用处:

                ATMemberType da = (ATMemberType)DAFactory.CreateDA(typeof(ATMemberType));
                TMemberType info = new TMemberType;
                SetInfo(info);
                da.Create(info)

    Create时在这里出错,出错信息为 此远程处理代理没有信道接收,这意味着服务器没有正在侦听的已注册服务器信道,或者此应用程序没有用来与服务器对话的适当客户端信道。

    就因为这问题折磨了我一天晚上,找尽了所有可用资源,还是没有解决。今天下午试着写一个日志,看看到底出错在哪,结果发现,问题应该就出在E的实例化处。于是,在BaseDataAccess 中新加一个属性


            public E NewEntity
            {
                get { return new E(); }
            }

    客户端稍稍改动一下

                ATMemberType da = (ATMemberType)DAFactory.CreateDA(typeof(ATMemberType));
                TMemberType info = da.NewEntity;
                SetInfo(info);
                da.Create(info);

    OK问题解决了,我不知道该佩服自己还是要检讨自己,这么一个小小的错误竟让自己郁闷了一天晚上。

  • 相关阅读:
    排序操作
    逻辑回归
    二叉树的建立以及相关操作,平衡二叉树
    【AMAD】cookiecutter-django -- 是一个构建Django项目的脚手架工具
    【AMAD】django-allauth
    【AMAD】django-formapi -- 一个DJANGO API框架,可使用签名request,可使用form作为API的验证工具
    【AMAD】django-cities -- 为Django项目提供国家,城市数据
    【AMAD】django-countries -- 为Django app的form提供country选项,为model提供CountryField
    【AMAD】django-social-auth -- 让django使用社交网络oauth鉴权变得极为轻松!
    每周分享第9期(2019.6.1)
  • 原文地址:https://www.cnblogs.com/faib/p/1413700.html
Copyright © 2011-2022 走看看