2009-11-01 118 views
2

我的web服務程序應該生成一個隨機代碼並將其返回給客戶端程序。現在它返回「」作爲代碼而不是隨機生成的代碼。我的變量範圍有什麼問題?謝謝。C#中的變量範圍

public class Service1 : System.Web.Services.WebService 
{ 
    private string code = ""; 

    [WebMethod] 
    public void StartGame() 
    { 
     // Pick a secret code 
     // R, B, G, O, T, W, P, Y 
     Random random = new Random(); 
     for (int i = 0; i < 4; i++) 
     { 
      int num = random.Next(8) + 1; 
      if (num == 1) 
       this.code += "R"; 
      else if (num == 2) 
       this.code += "B"; 
      else if (num == 3) 
       this.code += "G"; 
      else if (num == 4) 
       this.code += "O"; 
      else if (num == 5) 
       this.code += "T"; 
      else if (num == 6) 
       this.code += "W"; 
      else if (num == 7) 
       code += "P"; 
      else if (num == 8) 
       this.code += "Y"; 
     } 
    } 

    [WebMethod] 
    public string MakeGuess(string guess) 
    { 
     return this.code; 
    } 
} 

回答

12

問題是這些方法在類的兩個單獨實例上被調用。隨着HTTP請求進入,每個方法都會在類的新實例上調用一次,並且該類將被丟棄。由於HTTP協議的無狀態特性,服務器不知道這些請求會以某種方式相關。

+0

我相信我明白你在說什麼。就像jmayor建議的那樣,我應該使用會話。我也會問你是否知道會議上有什麼好的參考。謝謝! – Lou 2009-11-02 00:31:06

+0

Lou:在MSDN上查找它。此外,您可以通過要求客戶端在調用方法時傳遞ID(並提供發出客戶端ID的方法)來管理狀態。 – 2009-11-02 03:58:18

1

你是否正在進行兩個不同的調用,一個調用開始遊戲,另一個調用MakeGuess?分開的調用意味着在服務器端創建不同的對象。您應該創建會話或使代碼變爲靜態。

+0

嗨,使變量'代碼'靜態工作。你能解釋一下爲什麼我可以更好地理解?另外,我將如何去做一個會議?如果你能指出我的一些參考,我將不勝感激!謝謝 – Lou 2009-11-02 00:30:15

+0

您正在使用代碼作爲您班級的變量。這意味着只要你的班級生活就會生活。在服務器端調用WebMethod時,會創建類的實例來執行您的方法。你正在使用方法'StartGame'和'code'變量來獲得你想要的結果,但是當方法執行結束時你的對象被銷燬了。調用第二個方法創建一個新的實例來執行你的MakeGuess,現在'code'var是空的,因爲是新的。通過使這個代碼是靜態的,它的生命是否會創建你的類的不同實例 – jmayor 2009-11-02 16:56:26

+0

靜態解決了你的問題,但並不是更優雅,如果你調用WebService兩次,你會發現代碼會有一個接一個的結果,你需要每次開始遊戲時都會重置它。考慮使用局部變量和單個函數調用(如本文其他一些解決方案所建議的),或者您可以查看ASP.NET書目並熟悉Sessions,只需通過在.Net Web Services上實現Session來搜索即可。讀。 – jmayor 2009-11-02 17:00:10

0

如果沒有特別需要兩個電話爲什麼不做一個簡單的方法?

`

[WebMethod] 
    public string MakeGuess(string guess) 
    { 
     private string code = ""; 
     // Pick a secret code 
     // R, B, G, O, T, W, P, Y 
     Random random = new Random(); 
     for (int i = 0; i < 4; i++) 
     { 
      int num = random.Next(8) + 1; 
      if (num == 1) 
       this.code += "R"; 
      else if (num == 2) 
       this.code += "B"; 
      else if (num == 3) 
       this.code += "G"; 
      else if (num == 4) 
       this.code += "O"; 
      else if (num == 5) 
       this.code += "T"; 
      else if (num == 6) 
       this.code += "W"; 
      else if (num == 7) 
       code += "P"; 
      else if (num == 8) 
       this.code += "Y"; 
     } 
     return code; 
    } 
+0

感謝您的幫助,但我寧願將我的方法分解爲更小的步驟,因爲我計劃在稍後添加更多步驟。 :) – Lou 2009-11-02 00:33:54

1

無需額外的評論主講人:

public static string GenerateRandomCode(int length) 
{ 
    const string charset = "RBGOTWPY"; 

    string randomCode = ""; 
    Random random = new Random(); 

    while (length > 0) 
    { 
     length--; 
     randomCode += charset[random.Next(charset.Length)]; 
    } 
    return randomCode; 
} 
+0

謝謝。我對自己說「唔」。 – Lou 2009-11-03 14:41:16