1

我有一个托管在控制台应用程序上的 WCF 服务,代码是:

public interface ITestService
{
    [OperationContract]
    void SetField(string data);

    [OperationContract]
    string GetField();
}

public class TestService : ITestService
{
    private string myData;
    public string GetField()
    {
        retrun myData;
    }
    public void SetField(string data)
    {
        myData = data;
    }
}

然后我将它托管在控制台应用程序上:

ServiceHost host = new ServiceHost(typeof(TestService));

host.Open();            

Console.WriteLine("Test Service Host");
Console.WriteLine("Service Started!");

foreach (Uri address in host.BaseAddresses)
{
    Console.WriteLine("Listening on " + address);
}

Console.WriteLine("Press any key to close the host...");
Console.ReadLine();

host.Close();

我启动了控制台主机,然后在另一个控制台应用程序中,我引用了该服务并使用了它:

TestService client = new TestService();
client.SetField("test");
Console.WriteLine( client.GetField() );

这个 print nothing 意味着该字段仍然为空

这项服务有什么问题?

4

3 回答 3

3

问题是您期望在调用之间保持状态- 它不是。默认情况下,WCF 是绝对无状态的(它们应该是!这是一件好事!

如果您需要持久化信息 - 将其存储到持久存储(也称为数据库)中。

每个 WCF 调用将(默认情况下)获取一个全新的、新创建的TestService.

因此,您的第二个调用的实例对第一个实例(由 使用)一无所知SetField,因此无法返回您在第一个调用中设置的值。

于 2013-09-11T09:11:51.530 回答
1

您应该使用以下属性标记您的服务类:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]    
public class TestService : ITestService 
{ 
   //... 
}

这意味着您的服务必须只有一个实例。你必须像这样创建主机:

var host = new ServiceHost(new TestService()); // or get a singleton..
host.Open();

请注意,您使用实例来创建服务而不是类型。然后你的代码应该可以工作。

于 2013-09-11T09:36:12.180 回答
1

尝试这个:

使用字符串作为静态。

public interface ITestService
{
   [OperationContract]
   void SetField(string data);

   [OperationContract]
   string GetField();
}

public class TestService : ITestService
{
  private static string myData;
  public string GetField()
  {
    retrun myData;
  }
  public void SetField(string data)
  {
     myData = data;
  }
}
于 2013-09-11T09:13:47.780 回答