如何使用WCF从一个Windows应用程序表单获取值到另一个项目中的另一个表单?

时间:2016-05-11 02:49:08

标签: c# forms wcf

我还没有WCF的背景,所以到目前为止我所做的只是基于研究。我想要做的就是这个。

我使用三个项目创建了一个解决方案。两个Windows窗体应用程序和一个WCF服务应用程序。

在表单1中,有一个文本框和一个按钮。如果单击“更新”按钮,则单击“刷新”按钮时,文本框中的任何值都应反映在另一个表单中。以下是我到目前为止所做的事情:

ISimulatorService.cs

[ServiceContract]
public interface ISimulatorService
{
    [OperationContract]
    void SetSerialNumber(int value);

    [OperationContract]
    int GetSerialNumber();
}

ISimulatorService.svc

 public class Service1 : ISimulatorService
 {
    public int serial;
    public string modelName;

    public void SetSerialNumber(int value)
    {
        this.serial = value;
    }

    public int GetSerialNumber()
    {
        return serial;
    }
 }

Form1

中的更新按钮
 private void btn_update_Click(object sender, EventArgs e)
    {
        ServiceReference.SimulatorServiceClient client = new ServiceReference.SimulatorServiceClient();
        try
        {
            client.Open();
            client.SetSerialNumber(Convert.ToInt32(txt_serialnumber.Text));                
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            if (client.State == System.ServiceModel.CommunicationState.Opened)
            {
                //MessageBox.Show("Communication Closed");
                client.Close();
            }
        }

    }

表单2

中的刷新按钮
private void btn_update_Click(object sender, EventArgs e)
    {
        ServiceReference.SimulatorServiceClient client = new ServiceReference.SimulatorServiceClient();
        txt_serialnumber.Text = client.GetSerialNumber().ToString();
    }

返回值始终为零。我应该实现什么来存储值,以便我可以以其他形式检索该值?

1 个答案:

答案 0 :(得分:0)

您的serial变量不会在通话之间持续存在。当您致电SetSerialNumber然后关闭时,该服务将首次激活,当您拨打GetSerialNumber然后再次关闭时,该服务将再次激活。简而言之,它将是两个不同的实例,因此您需要一些东西来保持调用之间的数据。你有两种情况:

您不需要将数据保留在磁盘上,然后使用MemoryCache之类的内容。这是一个简短的片段:

public class Service1 : ISimulatorService
{
    private ObjectCache _cache = MemoryCache.Default;
    private CacheItemPolicy policy = new CacheItemPolicy();

    public void SetSerialNumber(int value)
    {
        _cache.Set("serial", value, policy);
    }

    public int GetSerialNumber()
    {
        (int)_chache["serial"];
    }
 }

您需要将数据保存在磁盘上,然后use a database