возвращать большие строковые данные из сервиса wcf в asp.net - PullRequest
0 голосов
/ 14 июля 2011

Я написал методы службы WCF, которые возвращают большие строковые данные, как показано ниже:

string IEmpService.GetEmployeeInfo()
{
    StringBuilder strData = new StringBuilder();
    //create list of user class  
    List<Users> lstUsers = new List<Users>();
    // populate 10000000 data from DB table at a time
    _ods = populateEmpData();// data store to dataset
    // convert dataset to list
    lstUsers = (from dr in _ods.Tables[0].AsEnumerable()
                   select new Users
                   {
                       UsersID = dr.Field<int>("UsersID"),
                       UserName = dr.Field<string>("UserName"),
                       Password = dr.Field<string>("Password")
                   }).ToList();

    // do Serialize of above list  and store it to a string builder(this create huge amount of string dada)     
    strData.Append(Utility.DeSerilization.comonMapper.SerializeList<List<Users>>(lstUsers));
    return strData.ToString(); 
}

Класс пользователя:

[Serializable]
[XmlRootAttribute(ElementName = "Users", IsNullable = false)]
public class Users
{
    [XmlElement("UsersID")]
    public int UsersID { get; set; }
    [XmlElement("UserName")]
    public string UserName { get; set; }
    [XmlElement("Password")]
    public string Password { get; set; }
}

При попытке запустить службу выдает следующее исключение:

strData.ToString ()
'strData.ToString ()' сгенерировал исключение типа 'System.OutOfMemoryException string {System.OutOfMemoryException}

Икогда я добавляю ссылку на службу и показываю данные в виде сетки, она также показывает ошибку.

Как правильно возвращать очень большую строку из службы WCF?

1 Ответ

0 голосов
/ 14 июля 2011

Основная проблема при попытке получить столько данных одновременно - это огромные накладные расходы на десериализацию всех этих данных.Я разбил бы данные на более управляемые куски на стороне сервера и делал бы повторные запросы к службе для следующего чанка, пока не осталось чанков.

Я также не знаю, почему вы делаетеСериализация себя.Я просто создал бы контракт данных для хранения ваших данных и позволил бы WCF автоматически обработать сериализацию / десериализацию:)

EDIT:

 [DataContract]
 public class Users
 {
     [DataMember]
     public int UsersID { get; set; }
     [DataMember]
     public string UserName { get; set; }
     [DataMember]
     public string Password { get; set; }
 }

 public List<Users> IEmpService.GetEmployeeInfo()
 {
     //create list of user class  
     List<Users> lstUsers = new List<Users>();
     // populate 10000000 data from DB table at a time
     _ods = populateEmpData();// data store to dataset
     // convert dataset to list
     lstUsers = (from dr in _ods.Tables[0].AsEnumerable()
               select new Users
               {
                   UsersID = dr.Field<int>("UsersID"),
                   UserName = dr.Field<string>("UserName"),
                   Password = dr.Field<string>("Password")
               }).ToList();

     return lstUsers;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...