2017-11-29 13 views
0

私はデータベースへのWebサービスに接続するウェブサイトを持って実行されない場合があり一貫性のないエラー:コレクションが変更された列挙操作が

私は私がこれらのコードを持って

{"Message":"Collection was modified; enumeration operation may not execute.","StackTrace":" at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)\r\n at System.Collections.Generic.List 1.Enumerator.MoveNextRare()\r\n at System.Collections.Generic.List 1.Enumerator.MoveNext()\r\n at System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable enumerable, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, Str

を言い、この一貫性のないエラーが発生していますc#Webサービスでは、この関数は0行以上を返します。

public class Liked 
    { 
     public bool liked; 
    } 

static List<Liked> _get_liked = new List<Liked> { }; 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    [WebMethod] 
    public List<Liked> get_liked(string userID,string postID) 
    { 
     DataTable table = null; 
     SqlCommand cmd = new SqlCommand(); 

     cmd.CommandText = "Like_Retrieve"; 

     cmd.Parameters.AddWithValue("@UserId", userID); 
     cmd.Parameters.AddWithValue("@PostId", postID); 

     cmd.CommandType = System.Data.CommandType.StoredProcedure; 
     table = this.dbcon.ExecuteDataTable(cmd); 

     _get_liked.Clear(); 
     Liked _list = new Liked(); 
     if (table.Rows.Count > 0) 
     {    
      _list.liked = true;  
     } 
     else 
     { 
      _list.liked = false; 
     } 
     _get_liked.Add(_list); 
     return _get_liked; 
    } 

エラーの原因には一貫性がありません。私はJavaScriptの中にこれらを持っています

function checkLike(userId, postId) { 
    $.ajax({ 

     type: "POST", 
     url: "../Main.asmx/get_liked", 
     data: "{'userID':'" + userId + "', 'postID':'" + postId + "'}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (response) { 
      var result = response.d; 
      $.each(result, function (index,data) { 
       var liked = data.liked; 
       if (liked == true) { 
        $("#" + postId).prev().parent("button").css("background", "#ccc"); 
       } 
       else 
       { 
        $("#" + postId).prev().parent("button").css("background", "white"); 
       } 
      }); 

     }, 
     error: function (xhr, ajaxOptions, thrownError) { 
      alert('error'); 
      console.log(postId); 
      console.log(userId); 
      console.log(xhr.responseText); 
      console.log(thrownError); 
     } 

    }); 
} 

誰かが私を助けてくれることを願っています。私は何時間も頭を叩いていました

+0

静的変数_get_likedがシリアル化されている間に、同時呼び出しと関連しているようですが、別の呼び出しがそれを操作しようとしています。 – mehran

答えて

3

あなたはすべてのリクエストでコードが変更される静的リストを返します。このコードは、2つ以上の要求が並行して実行されているときに不規則に動作することが予想されます。特に、応答がシリアル化されたときにエラーが表示され、別の要求によって同時にリストが.Clear()になる場合は失敗します。

フィックス - 代わりreturn _get_likedの新しいリストを毎回戻し、あなたのコードから完全_get_likedを削除:

 return new List<Liked> { 
     new Liked { liked = table.Rows.Count > 0 } 
    }; 

少なくともWebアプリケーションに推奨されてstaticを使用して一般的には - 例えばScope of static Variable in multi-user ASP.NET web applicationを参照してください。

+0

どこにコードを入れてください。 –

+0

あなたのソリューションを試してみました。しかし、これを使うもっとクリーンな方法があります。 –

関連する問題