行为不端的服务行为

时间:2013-03-26 15:07:16

标签: c# winforms wcf debugging

基本上我正在制作一个模拟加油站系统的程序。

我的问题是我正在尝试通过这样的WCF服务发送请求:

User Requests Pump to be activated ----> WCF SERVICE ---->  Point of Sale
User starts pumping petrol<---- WCF SERVICE <----  Point of Sale Accepts

目前它有效,但有时只是。

这就是我尝试回复的方式:

 while(PumpserviceClient.getRequestedAcceptedStatusFromPos().Accepted == false)
 {
    PumpserviceClient.RequestPump(int.Parse(PumpID));
    // needs to wait for pump to be activated
    if (PumpserviceClient.getRequestedAcceptedStatusFromPos().Accepted == true /*&& PumpserviceClient.getRequestedAcceptedStatusFromPos().PumpNo == int.Parse(PumpID)*/)
    {
       MessageBox.Show(" The Pos has accepted your pump request");
       // if its accepted you call
       Customer.ActivatePump();
    } 

这些是服务中的方法:

bool Accepted= false;
bool Requested=false;
public void AcceptPump(int PumpNumber)
{
   Accepted = true;
   Requested = false;
   int pumpnumber = PumpNumber;
   PumpRequest.Accepted = Accepted;
   PumpRequest.Requested = Requested;
}

public void RequestPump(int PumpNumber)
{
   int pumpnumber = PumpNumber;
   Requested = true;
   Accepted = false;

   PumpRequest.Accepted = Accepted;
   PumpRequest.PumpNo = PumpNumber;
   PumpRequest.Requested = Requested;
}

public void ResetRequest(int PumpNumber)
{
   int pumpnumber = PumpNumber;
   Requested = false;
   Accepted = false;

   PumpRequest.Accepted = Accepted;
   PumpRequest.PumpNo = 0;
   PumpRequest.Requested = Requested;
}

public Message getRequestedStatusFromPump()
{
   return PumpRequest;
}

public Message getRequestedAcceptedStatusFromPos()
{
   return PumpRequest;
}  

}

并且销售点系统通过以下方式接受请求:

if (Client.getRequestedStatusFromPump().Requested == true)
{
   MessageBox.Show("Pump Number: "+Client.getRequestedStatusFromPump().PumpNo + " Is waiting to be accepted");
   // need to press a button or something
   Client.AcceptPump(Client.getRequestedStatusFromPump().PumpNo);
}

此处代码http://www.pastebucket.com/8642

2 个答案:

答案 0 :(得分:1)

我看了发布的代码。您使用以下属性:

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

这意味着您的代码不会是多线程的。但是不能保证多个会话不会发出请求并“中断”彼此的工作流程。

例如:

  1. 客户A调用请求泵

  2. 客户B调用重置泵

  3. 客户A读取...客户A想知道泵重置的原因。

  4. 编写代码时,期望对象是通过会话进行的。我建议使用这种上下文模式,看看你是否有更好的运气。

    另一种选择是将会话信息添加到模型中。我无法想象为什么这会有用。这当然不容易。

答案 1 :(得分:0)

我发现这个问题的唯一方法是在不改变服务行为的情况下创建一个新列表

 public void CreatePumpList()
    {
        WaitingPumps = new List<WaitingPumps>();
        for (int i = 0; i < PumpLimit+1 ; i++)
        {
            WaitingPumps.Add(new WaitingPumps());
        }
    }

然后只需使用泵号作为此列表中的索引,这样就不会相互混淆。