在WCF中,如何像在服务器定义一个实例,然后将其返回至客户端。在Remoting中,可以实现,在服务器上实例化一个MarshrefObject的对象,可以以远程对象的形式返回客户端,进而实现在客户端操作服务器的对象。

解决方案 »

  1.   

    数据合同你随便本WCF的书都会提到的http://tuibianzhilv001.blog.163.com/blog/static/16756387720109711225423/
      

  2.   

    楼上的例子是在服务器上使用Host.Open的方式,在客户端做获取Proxy远程实例。我以前使用Remoting实现的一段代码,在WCF中不知如何实现了:服务器方法:
    namespace MyApp
    {
        //服务器对象
        public class TransitObject : MarshalByRefObject, ITransitObject
        {      public string Get_Str(string sValue)
          {
              return System.AppDomain.CurrentDomain.BaseDirectory ;
          }      public DateTime  Get_Date(DateTime dValue)
          {
              return dValue;
          }
        }
      //接口
      public interface ITransitObject
      {
          string Get_Str(string sValue);      DateTime Get_Date(DateTime dValue);
      }   
    }//在另一个服务器方法中实例化TransitObject,并传回proxy对象至用户端
    public class MyService : MarshalByRefObject
    {
           
            public ITransitObject GetTransitObject()
            {
                return new TransitObject();
            }
        }
    客户端方法:
      [STAThread]
            static void Main(string[] args)
            {
                RemotingConfiguration.Configure(“MyApp.exe.config");            MyService myService = new MyService();
             
                Console.Readine(); //这里返回的tranObject就是proxy对象了
                ITransitObject tranObject = myService.GetTransitObject();
                Console.WriteLine(tranObject.Get_Str("")); 
                Console.Readine();
            }
      

  3.   

    先贴代码。//服务端
    TcpServerChannel channel = new TcpServerChannel(Convert.ToInt32(sTCPIP));
    ChannelServices.RegisterChannel(channel, false);
    RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off;
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(BaseInterface.BaseActive), "BaseActive", WellKnownObjectMode.SingleCall);
    //客户端
     RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off;
    RemotingConfiguration.RegisterWellKnownClientType(typeof(BaseInterface.BaseActive), "tcp://192.168.13.111:8098/BaseActive");
    对着改吧。
      

  4.   

    4楼没有理解我的意思。我的意思是要在服务器上动态生成对象,将proxy返回到客户端,客户端就可以通过proxy操作服务器对象了。
      

  5.   

    WCF不支持直接这么处理。你把Proxy对象的方法,都抽出来作为OperationContract更合适。
      

  6.   

    Oh.那我原来的项目升WCF,工程就比较大了。
      

  7.   

    ITransitObject 不正好是一个ServiceContract吗?
      

  8.   

    恩,如果是通过wsdl引用生成本地代理的就要大改了。但如果你是通过双方部署ServiceContract的方式,你可以包装成和你Remoting方法类似的。
      

  9.   

    恩,只要提供个方法形如:myService.GetTransitObject() 就可以。
    // 自己实现IDisposable
    public class Service<T> : IDisposable
    {
       private static NetTcpBinding _binding;
       private static string _address; 
       private static ChannelFactory<T> _factory;  
       static Service()
       {
          //静态初始化,初始化binding和address
       }
        
       public void Open()
       {
          _factory = new ChannelFactory<T>(_binding, _address);
          _factory.Open(); 
       }
       public void Close()
       {
          if (_factory != null)
             _factory.Close();
       } 
       private T GetTransitObject() 
       { 
           return factory.CreateChannel();
       }
    }
    使用:
    var svc = new Service<ITransitObject>();
    var obj = svc.GetTransitObject();
    obj.Get_Str("");
      

  10.   

    上面稍微修改下:_factory改为非static的。using(var svc = new Service<ITransitObject>())  
    {
       svc.Open();
       var obj = svc.GetTransitObject();
       obj.Get_Str("");  
       svc.Close(); 
    }
      

  11.   

    在Open()之前,是否需要判断一下这个address是否已经打开了?