Развертывание приложения WCF в IIS, но соединение с базой данных SQL Server не работает - PullRequest
1 голос
/ 20 сентября 2010

Я новичок в WCF, я пытаюсь развернуть пример приложения WCF на IIS, это приложение отлично работает в режиме отладки с VS2008, это приложение аутентифицирует сообщения WCF с помощью следующего кода.Я делаю это так, я добавил полученные .dlls web.config и Service.svc в каталог wwwroot, а также добавил строку подключения в диспетчере IIS, которая является

Server=MyPC\SQLEXPRESS;Database=MySampleDb;Integrated Security=true

IЯ использую встроенную безопасность Windows.Я использую ту же строку подключения для подключения в классе базы данных, но получаю следующее исключение:

Пожалуйста, сообщите мне, чтобы развернуть это приложение

В Validater

public override void Validate(string userName, string password)  
{  
       ValidateUser(userName, password);   
}  

public static bool ValidateUser(string userName, string password)  
{  
    if (!string.IsNullOrEmpty(userName))  
    {         
       ICustomer customer = GetCustomerByUsername(userName);  
       if (customer ==null)  
       {  
           throw new exception("User Not found.");  
       }  
       else  
       {  
           return true;  
       }  
    }   
    else   
    {  
        throw new FaultException("User name is required!");  
    }  
}  

public static ICustomer GetCustomerByUsername(string username)  
{  
   try  
   {  
       //ConnectionString= "Server=MyPC\SQLEXPRESS;Database=MySampleDb;Integrated Security=true";  
       OpenConnection();  

       var cmd = new SqlCommand("GetUserByUsername", _connection) { CommandType = CommandType.StoredProcedure };  

       cmd.Parameters.Add("Username", username);  

       connState = _connection.State.ToString();  

       if (_connection.State == ConnectionState.Closed)  
       {
           OpenConnection();  
       }    

       SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);  

       ICustomer customer = null;  

       customer = ExtractCustomerFromDataReader(dr)[0];  
       dr.Close();  
       return customer;  
    }  
    catch (Exception e)  
    {  
       throw new Exception(e.Message + Environment.NewLine + e.StackTrace);  
    }  
    finally  
    {  
       CloseConnection();  
    }  
}  

Исключение:

ExecuteReader требует открытого и доступного соединения.Текущее состояние соединения закрыто.в System.Data.SqlClient.SqlConnection.GetOpenConnection (метод String) в System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute (метод String, команда SqlCommand) в System.Data.SqlClient.SqlCommand.anc, at..Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, метод Stb, результат DbAsyncResult) в System.Data.SqlClient.Sql0Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior, метод String) в System.Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior) в Aschrafi.MobileZollServer.Services *atabase *atabaseHelper.Getser1016 * Я думаю, что мне не хватает какого-то пункта в настройках базы данных или в IIS Manager в настройках веб-сайта.Некоторые учебные материалы или ссылки на статьи для развертывания WCF в IIS и проверки подлинности связи WCF будут очень полезны.

Заранее спасибо.

1 Ответ

0 голосов
/ 20 сентября 2010

В сообщении об ошибке совершенно четко говорится, что ваше соединение не открыто в то время, когда вы пытаетесь запустить программу чтения данных.

По сути, я бы рекомендовал полностью переписать ваш метод GetCustomerByUsername - используйте блоки using(...) { ... } в качестве лучшей практики для ваших SqlConnection и SqlCommand - что-то вроде этого:

public static ICustomer GetCustomerByUsername(string username)  
{  
   ICustomer customer = null;

   try  
   {  
       using(SqlConnection _con = new SqlConnection(connectionString))
       using(SqlCommand _cmd = new SqlCommand("GetUserByUsername", _con))
       { 
           _cmd.CommandType = CommandType.StoredProcedure;  
           _cmd.Parameters.Add("Username", username);  

           _con.Open();

           using(SqlDataReader dr = cmd.ExecuteReader())
           {
              customer = ExtractCustomerFromDataReader(dr)[0];  
              dr.Close();  
           }

           _con.Close();
        }

        return customer;  
    }  
    catch (Exception e)  
    {  
       throw new Exception(e.Message + Environment.NewLine + e.StackTrace);  
    }  
}  

Используя блоки using(), вы гарантируете, что рассматриваемый экземпляр класса будет освобожден в конце блока { ... } - больше не нужно отслеживать состояние и больше не нужно предложение finally.

Также: встроенная система безопасности отлично работает на вашем рабочем столе - но она не будет хорошо работать в размещенной среде.В конце концов: это процесс IIS, который теперь подключается к вашей базе данных - я бы предпочел использовать здесь конкретного пользователя с паролем.

Обновление: вы можете назвать своего пользователя как угодно -например, используйте имя приложения в качестве имени пользователя или что-то еще, что имеет для вас смысл.Вам необходимо создать это, например, с помощью SQL Server Express Management Studio, и сначала необходимо создать имя входа, используя CREATE LOGIN или эквивалент GUI (в разделе «Безопасность» - «Вход в систему» ​​- щелкните правой кнопкой мыши и выберите «Новый вход в систему») -этот шаг дает этому «имени» право в первую очередь входить в SQL Server.Это точка, где вы тоже выбираете пароль.

После того, как вы создали этот логин, вам нужно создать пользователя на основе этого логина в вашей базе данных (USE <database name> GO - CREATE USER ...... - или использовать графический интерфейс - Ваша база данных -> Безопасность -> Пользователи -> щелкните правой кнопкой мышии выберите «Новый пользователь»).

После того как все это будет у вас, строка подключения будет выглядеть примерно так:

Server=MyPC\SQLEXPRESS;Database=MySampleDb;User Id=(your user name);Pwd=(your password)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...