在使用应用程序中托管的wcf服务时,如何管理应用程序状态?

时间:2014-03-31 17:34:01

标签: c# wpf wcf

我是wcf的初学者,我遇到了这个我无法解决的有趣问题。

所以我有以下服务(显然是简化)。

合同:

class IService
{
    [OperationContract]
    void setList(string sourceName);

    [OperationContract]
    List<aux> returnList();         
}

[DataContract]
class ServiceData
{   
    //Coresponding data member property = ListOfAuxiliaryData
    [DataMember]
    List<auxData> listOfAuxiliaryData;
}

class auxData
{
    //all these members have corresponding properties using the first capital letter   convention 
    string name;
    List<string> auxiliaryDataInformation;
}

之后我实现了这样的服务:

class SerivceImplementation:IContract
{
     ServiceData serviceData = new ServiceData()

     setList(string sourceName)
     {
         //this works
         serviceData.ListOfAuxiliaryData = GetListFromValidDataSource(sourceName);
     }

     List<auxData> getList()
     {
          return serviceData.ListOfAuxiliaryData;
     }

}

一切都很好。我没有问题地实现了服务主机,因此下一个合乎逻辑的步骤是实现客户端。我使用wpf作为客户端,并使用可观察集合作为代理集合类型。所以我开始像这样实施

ServiceReference.ServiceClient Proxy = new ServiceClient();    

    public MainWindow()
    {
        InitializeComponent();
        Proxy.setList("Questions.Json");
        var listOfQuestions = Proxy.getListOfQuestions();
    }

我的问题是,即使列表由于某种原因设置正确(在一些调试后发现),当我尝试获取列表时,如果首先执行初始化服务数据的实现的第一行并且逻辑上它返回一个null导致每个人最喜欢的空指针异常。

发生了什么,我该如何解决这个问题。

请帮忙, 西普里安

1 个答案:

答案 0 :(得分:1)

如果您的服务中不需要某个州,则不应该持有一个州:

[OperationContract]
void setList(string sourceName);

[OperationContract]
List<aux> returnList(); 

这可能很容易

[OperationContract]
List<aux> getList(string sourceName); 

服务通常不是有状态的。您可以通过各种方式实际让它保持状态,但开箱即用,无论何时打开新客户端,新服务都会在另一端实例化。两者之间没有任何东西保存。