多个客户端必须与我的WCF服务相互作用时出现问题

时间:2016-03-31 00:17:21

标签: c# wcf

我正在尝试使用WCF服务制作扫雷游戏。看来我能够从客户端连接到服务,远程调用方法并获得返回的内容。

问题是,在服务端,我使用数组。每次客户端连接到服务时,该数组都应该自行更新,并且确实如此,但每次客户端连接时,数组都会重置为0,就好像有多个服务实例一样......

以下是您可能想要查看的代码:

在服务接口上,IService1.cs

public interface IDemineur
{
    [OperationContract]
    string CreationJoueur(string Name);
    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);

    // TODO: Add your service operations here
}

Service1.svc

public class Service1 : IDemineur
{
    Dictionary<int, Grille> Gamepad = new Dictionary<int, Grille>();
    int[,] tableGrilles = new int[20, 3];

    public string CreationJoueur(string Name)
    {
        string joueur = "";

        for (int i = 0; i < 20; i++)
        {
            if (tableGrilles[i, 0] != 1)
            {
                tableGrilles[i, 0] = 1;
                tableGrilles[i, 2] = i;
                joueur = "1/" + tableGrilles[i, 2];
                Gamepad.Add(i, new Grille());

                break;
            }
            if (tableGrilles[i, 1] != 2)
            {
                tableGrilles[i, 1] = 2;
                joueur = "2/" + tableGrilles[i, 2];

                break;
            }
        }

        return joueur;
    }

这里,重点是更新数组tableGrilles。当我为主机运行调试时,我可以清楚地看到它确实更新了它,但每当我与另一个客户端连接时,它会在我的断点处再次进入调试模式,并且数组返回到0。

客户方:

public partial class DemineurGrille : Window
{
    ServiceReference1.DemineurClient leDemineur;
    int noJoueur;
    int noGrille;

    public DemineurGrille(string name)
    {
        InitializeComponent();
        leDemineur = new ServiceReference1.DemineurClient("*");

        string noJoueurGrille = leDemineur.CreationJoueur(name);
        string[] leSplit = noJoueurGrille.Split('/');
        noJoueur = Convert.ToInt32(leSplit[0]);
        noGrille = Convert.ToInt32(leSplit[1]);
    }

请帮忙,非常感谢...

2 个答案:

答案 0 :(得分:1)

这是因为InstanceContextMode默认设置为PerSession。换句话说,每次连接客户端时都要创建一个新服务,因此对象将为空。

快速解决方案是将InstanceContextMode更改为Single,这意味着所有请求将共享一个实例,直到重置进程(网站)。但是,这意味着每个客户端都在更新相同的阵列,这可能不是您想要的。

更强大的解决方案是使用数据存储,例如数据库,它将为每个用户存储单独的数组,从而确保用户A更新阵列A,用户B更新阵列B等。

答案 1 :(得分:0)

这不是问题。您的断点可能会在另一个请求启动的另一个会话中被触发,并在另一个线程中。