2012-02-12 3 views
1

Когда я создал вложенную hastable в wcf, я получаю сообщение об ошибке «Основное соединение было закрыто: соединение было неожиданно закрыто». Я не знаю, где проблема.отправка вложенной хэш-таблицы

Клиентский код

private static List<Playlist> remotePlaylistArray; 
    private static List<Playlist> _PlaylistArray; 
    public static List<Playlist> PlaylistArray 
    { 
     get 
     { 
      if (_PlaylistArray == null) 
      { 
       _PlaylistArray = myClient.GetPlaylists(Username, Password, (int)UserInf["id"], "%").Select(i => new Playlist 
       (
        i["name"].ToString(), 
        true, 
        ((Hashtable[])i["medias"]) == null ? null : 
        ((Hashtable[])i["medias"]).Select(ix => new YoutubeMedia() 
        { 
         Duration = ix["duration"].ToString(), 
         Title = (string)ix["title"], 
         ID = (string)ix["videoinf"] 
        }).ToArray() 
       ) { ID = (int)i["id"] }).ToList();//The underlying connection was closed: The connection was closed unexpectedly. 

       remotePlaylistArray = new List<Playlist>(_PlaylistArray); 
      } 

      return _PlaylistArray; 
     } 

Service Code

public IEnumerable<Hashtable> GetPlaylistItems(string username, string password, int pid) 
    { 
     return this.ExecuteHashtable("GetPlaylistItems", username, Crypter.DoTwiceMD5(password), pid); 
    } 

    public IEnumerable<Hashtable> GetPlaylists(string username, string password, int userid, string filter) 
    { 
     List<Hashtable> list = this.ExecuteHashtable("GetPlaylists", username, Crypter.DoTwiceMD5(password), userid, filter).ToList(); 

     foreach (var item in list) 
     { 
      Hashtable[] arr = GetPlaylistItems(username, password, (int)item["id"]).ToArray(); 
      item.Add("medias", arr.Length != 0 ? arr : null); 
     } 

     return list; 
    } 

исключение происходит из TraceListener является

Тип 'System.Collections.Hashtable []' с именем контракта данных «ArrayOfArrayOfKeyValueOfanyTypeanyType: HTTP : //schemas.microsoft.com/2003/10/Serialization/Arrays 'не ожидается. Подумайте об использовании DataContractResolver или добавьте любые типы, не известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданных DataContractSerializer.

ответ

0

Что происходит в вашем случае, так это то, что HashTable не является непосредственно сериализуемым, поэтому, если вам действительно нужно вернуть HashTable, вам нужно написать собственный сериализатор.

Один вопрос: знает ли ваш сервер тип плейлиста? Если да, я настоятельно рекомендую вам вернуть список вместо HashTable ...

Смежные вопросы