none
В чем причина ошибки "Сервер не предоставил значащий ответ. Это может быть вызвано несоответствием контракта, преждевременным завершением сеанса или внутренней ошибкой сервера" RRS feed

  • Вопрос

  • Ошибка появляется при вызове  одного и того же метода, причем у одних пользователей она появляется, а у других нет.Сервис работает через интернет.

    Тело метода:

       public AutorizationData Autentificate(string faLogin, string faPassword, string faToken)
            {
    
                //log.Info("Результат сложения = " + r);
                AutorizationData result = new AutorizationData();
                if (faLogin == null || faPassword == null)
                {
                    result.Result = false;
                    result.Message = "Вы ошиблись при вводе логина или пароля";
                    return result;
                }
                //CTNhBootStrapper.Initialize(Assembly.GetCallingAssembly(), false,
                //  HelpMethods.GetConnectionString());
                CTNhBootStrapper straper = new CTNhBootStrapper();
    
    
                try
                {
                    string hash = HelpMethods.GetMd5(faPassword);
    
    
                    if (mSession.Id.HasValue)
                    {
                        Npgsql.NpgsqlConnection c = new Npgsql.NpgsqlConnection(HelpMethods.GetConnectionString(TypeConnectionstring.SwitchCadTechWeb));
                        c.Open();
                        string select = "select id,login,password,clientid,email,enable from switch.users where id=:id";
                        Npgsql.NpgsqlCommand command = new Npgsql.NpgsqlCommand(select, c);
                        command.Parameters.Add(new Npgsql.NpgsqlParameter("id", mSession.Id));
                        Npgsql.NpgsqlDataReader reader = command.ExecuteReader();
    
                        if (!reader.HasRows)
                            throw new FaultException("Пользователя не существует");
                        reader.Read();
                        CTUserA u = new CTUserA();
                        u.Id = Int64.Parse(reader.GetValue(0).ToString());
                        u.Login = reader.GetValue(1).ToString();
                        u.Password = reader.GetValue(2).ToString();
                        string clientid = reader.GetValue(3).ToString();
                        mUserName = u.Login;
                        u.Email = reader.GetValue(4).ToString();
                        u.Enable = reader.GetValue(5).ToString() == "T" ? true : false;
                        reader.Close();
                        GetConnectionString(c, clientid);
                        straper.OpenSession(mConnectionString);
                        IList<CTClient> clients = straper.CreateQuery("from CTClient c where c.User.Id=:user").SetParameter("user", u.Id).List<CTClient>();
                        if (clients.Count == 0)
                        {
                            IList<CTEmployee> emps = straper.CreateQuery("from CTEmployee e where e.User.Id=:user").SetParameter("user", u.Id).List<CTEmployee>();
    
                            if (emps.Count == 0)
                            {
                                mSession.LogOut();
                                result.Result = false;
                                result.Message = "Данный пользователь не прикреплен ни клиенту ни к сотруднику";
                                return result;
                            }
                        }
                        else
                            if (clients.Count > 0)
                            {
                                if (!clients[0].Enable)
                                {
                                    mSession.LogOut();
                                    result.Result = false;
                                    result.Message = "Нет доступа";
                                    return result;
                                }
                            }
    
                        if (u != null && u.Enable.HasValue && u.Enable.Value)
                        {
                            result.Result = true;
                            result.User = (CTUserADTO)(u).GetObjectDTO();
                            straper.Clear();
                            straper.CloseSession();
                            return result;
                        }
                        else
                        {
                            mSession.LogOut();
                            straper.Clear();
                            straper.CloseSession();
                            result.Message = "Пользователь заблокирован или его не существует";
                            result.Result = false;
                            return result;
                        }
    
    
                        c.Close();
                    }
                    else
                    {
                        Npgsql.NpgsqlConnection c = new Npgsql.NpgsqlConnection(HelpMethods.GetConnectionString(TypeConnectionstring.SwitchCadTechWeb));
                        c.Open();
                        string select = "select id,login,password,clientid,email,enable from switch.users where lower(login)=lower(:Login) and password=:Password";
                        Npgsql.NpgsqlCommand command = new Npgsql.NpgsqlCommand(select, c);
                        command.Parameters.Add(new Npgsql.NpgsqlParameter("Login", faLogin));
                        command.Parameters.Add(new Npgsql.NpgsqlParameter("Password", hash));
                        Npgsql.NpgsqlDataReader reader = command.ExecuteReader();
                        if (reader.HasRows)
                        {
                            reader.Read();
                            CTUserA u = new CTUserA();
                            u.Id = Int64.Parse(reader.GetValue(0).ToString());
                            u.Login = reader.GetValue(1).ToString();
                            mUserName = u.Login;
                            u.Password = reader.GetValue(2).ToString();
                            string clientid = reader.GetValue(3).ToString();
                            u.Email = reader.GetValue(4).ToString();
                            u.Enable = reader.GetValue(5).ToString() == "T" ? true : false;
                            result.Result = true;
                            result.User = (CTUserADTO)u.GetObjectDTO();
                            reader.Close();
                            if (!result.User.Enable.HasValue || !result.User.Enable.Value)
                            {
                                result.Message = "Пользователь заблокирован";
                                result.Result = false;
                                return result;
                            }
                            mSession.Id = result.User.Id;
                            GetConnectionString(c, clientid);
                            straper.OpenSession(mConnectionString);
                            IList<CTClient> clients2 = straper.CreateQuery("from CTClient c where c.User.Id=:user").SetParameter("user",
                                mSession.Id).List<CTClient>();
                            if (clients2.Count == 0)
                            {
                                IList<CTEmployee> emps = straper.CreateQuery("from CTEmployee e where e.User.Id=:user").SetParameter("user",
                                    mSession.Id)
                                    .List<CTEmployee>();
                                if (emps.Count == 0)
                                {
                                    mSession.LogOut();
                                    result.Result = false;
                                    result.Message = "Данный пользователь не прикреплен ни клиенту ни к сотруднику";
                                }
                            }
                            straper.Clear();
                            straper.CloseSession();
    
    
                            if (result.Result&&result.User.Login!="demo")
                            {
                                lock (mClients)
                                {
                                    IEnumerable<CTAutorizeInfo> list = from n in mClients
                                                                       where n.Login == mSession.Id
                                                                       select n;
                                    if (list.Count<CTAutorizeInfo>() > 0)
                                    {
                                        IList<CTAutorizeInfo> cc = list.ToList<CTAutorizeInfo>();
                                        IEnumerable<CTAutorizeInfo> rr = from n in cc
                                                                         where n.Token != faToken
                                                                         select
                                                                         n;
                                        if (rr.Count<CTAutorizeInfo>() > 0)
                                        {
                                            mSession.LogOut();
                                            result.Result = false;
                                            result.Message = "Пользователь уже подключен";
                                        }
    
                                    }
                                    else
                                        mClients.Add(new CTAutorizeInfo() { Login = mSession.Id.Value, Token = faToken });
                                    if (mSession.Id.HasValue)
                                        mSessionId = mSession.Id.Value;
                                }
                            }
    
                        }
                        else
                            if (string.IsNullOrEmpty(result.Message))
                            {
                                result.Message = "Вы ошиблись при вводе логина или пароля";
                            }
    
    
                        c.Close();
                    }
                }
                catch (FaultException er)
                {
                    straper.CloseSession();
                    WriteLog(er);
                    throw new FaultException(er.Message + "~" + er.StackTrace);
                }
                catch (Exception er)
                {
    
                    straper.CloseSession();
                    WriteLog(er);
                    throw new FaultException("Ошибка при аутентификации  пользователя " + "~"+er.Message+"\r\n" + er.StackTrace);
                }
                straper.CloseSession();
                return result;
    }


Ответы

  • Что из себя представляет AutorizationData, случайно не тип содержащий большой массив, который не сериализуем в некоторых случаях? Если есть возможность оберните тело метода в try - catch и попробуйте логить исключения, скорее всего оно выбрасывается. Потом уже видно будет в чём дело.
    Модератор

Все ответы

  • Если честно, в таком куске коды сложно разобраться так сходу. Вы хоть напишите в каком месте у вас возникает ошибка. Ну и исходя из текста ошибки, первым делом проверьте контракты, правильную обработку сеанса.
  • Что из себя представляет AutorizationData, случайно не тип содержащий большой массив, который не сериализуем в некоторых случаях? Если есть возможность оберните тело метода в try - catch и попробуйте логить исключения, скорее всего оно выбрасывается. Потом уже видно будет в чём дело.
    Модератор