Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单WCF问题_Wcf_Wcf Client - Fatal编程技术网

简单WCF问题

简单WCF问题,wcf,wcf-client,Wcf,Wcf Client,所以我正在学习WCF,我遇到了一个我认为与实例控制/状态有关的问题,但我不确定 工作流如下,基本的客户机/服务器范例 客户端调用RetrieveBusinessObjects(criteria)方法,服务器调用数据层,然后将它们放入服务器端的IList中。它不会将此列表返回给调用客户端 然后,客户机将调用DisplayBusinessObjects()方法,该方法将从服务器检索IList,序列化它们,将它们跨线显示 如果我使用WCFTestClient尝试此操作,它会工作。如果我从实际的客户端运

所以我正在学习WCF,我遇到了一个我认为与实例控制/状态有关的问题,但我不确定

工作流如下,基本的客户机/服务器范例

  • 客户端调用RetrieveBusinessObjects(criteria)方法,服务器调用数据层,然后将它们放入服务器端的IList中。它不会将此列表返回给调用客户端

  • 然后,客户机将调用DisplayBusinessObjects()方法,该方法将从服务器检索IList,序列化它们,将它们跨线显示

  • 如果我使用WCFTestClient尝试此操作,它会工作。如果我从实际的客户端运行它,那么我将返回一个大小为0的BusinessObject[]。对我来说,这表明我没有要归还的对象


    这是一个状态MGMT问题还是我错过了什么?

    < p>您需要考虑:默认情况下,对WCF服务的每次调用都会导致新创建的服务类实例。

    因此,如果您第一次调用RetrieveBusinessObjects(…),服务类的一个新实例将被实例化,项目将被检索并存储在对象实例中,并且当调用完成时,实例将被释放

    您对DisplayBusinessObjects()的第二次调用将再次获得服务类的一个新实例—它不知道先前的调用,因此它的BusinessObject数组中不能包含任何内容—毕竟它是一个新实例


    这种情况不太适用-您需要重新构建解决方案,以便单个调用将获取并返回业务对象列表-然后将它们缓存在客户端上。或者,您需要使用服务器上的持久性缓存/存储来缓存调用之间获取的那些项。

    < P>我同意@ McCus,因为您应该考虑使服务操作更粗粒度,并考虑将它们组合在一个操作中。您没有说明为什么第一次调用必须将数据存储在服务层中,而只在第二次调用中返回数据

    但是,如果您在服务实现中绝对需要此方法,则可以使用每会话实例实现服务:

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class MyService : IService
    {
       private MyState _myState;
    
       public MyService()
       {
          _myState = new MyState();
       }
    
       public void RetrieveBusinessObjects(...)
       {
          _myState.Items = GetDataFromDataLayer();
       }
    
       public IList<Item> DisplayBusinessObjects()
       {
          return _myState.Items;
       }
    }
    
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
    公共类MyService:IService
    {
    私人MyState(u MyState);
    公共MyService()
    {
    _myState=新myState();
    }
    public void RetrieveBusinessObjects(…)
    {
    _myState.Items=GetDataFromDataLayer();
    }
    公共IList DisplayBusinessObjects()
    {
    返回_myState.Items;
    }
    }
    

    这确保每个客户机都有自己的服务实例及其内部状态。但是,这种方法的可扩展性不太好,所以在做出决定之前,您可能需要仔细研究一下。

    请发布您的代码/合同。为什么不为此只进行一次调用呢?让您的
    DisplayBusinessObjects
    同时完成这两项工作。然后,您可以保持无状态的性质。