Я новичок в WCF, я пытаюсь развернуть свое примерное приложение WCF на IIS. Это приложение отлично работает в режиме отладки с VS2008. Это приложение аутентифицирует сообщения wcf с помощью следующего кода. Я делаю это так: я добавил полученные .dlls web.config и Service.svc в каталог wwwroot, а также добавил строку подключения в диспетчере IIS, которая является
Сервер = MyPC \ SQLEXPRESS; База данных = MySampleDb; Встроенная безопасность = true
Я использую встроенную систему безопасности Windows. Я использую ту же строку подключения для подключения в классе базы данных, но получаю следующее исключение:
Пожалуйста, помогите мне развернуть это приложение. В Validater public override void Validate (string userName, string password) {ValidateUser (userName, password); }
общедоступный статический логический тип ValidateUser (строка userName, строка пароля) {if (! string.IsNullOrEmpty (userName)) {ICustomer customer = GetCustomerByUsername (userName); if (customer == null) {генерировать новое исключение ("Пользователь не найден."); } else {вернуть истину; }
}
else
{
throw new FaultException("User name is required!");
}
}
общедоступный статический ICustomer GetCustomerByUsername (строковое имя пользователя) {попробуйте {// 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 (строковый метод) в System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute (строковый метод, команда SqlCommand) в System.Data.SqlClient.SqlCommand.ValidateCommand (как строковый метод) в System.Data.SqlClient.SqlCommand. .Data.SqlClient.SqlCommand. Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior, метод String) в System.Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior) в Aschrafi.MobileZollServer.Services.DatabaseHelper.GetCustomerByUsername (имя пользователя)
Я думаю, что мне не хватает какой-то точки в настройках базы данных или в диспетчере IIS в настройках веб-сайта. Некоторые учебники или ссылки для развертывания wcf в iis и аутентификации связи wcf были бы очень признательны. заранее спасибо.
Интегрированная безопасность означает, что соединение происходит под учетными данными потока, выполняющего операцию Open. Обычно поток имеет учетные данные процесса, в случае IIS и WCF это означает, что AppPool настроил учетные данные для запуска от имени. Если поток олицетворяет себя (как это часто бывает с WCF), тогда поток имеет учетные данные вызывающего и ограниченное делегирование происходит для аутентификации на удаленном сервере БД. Какие бы учетные данные ни использовались, они должны быть доверенными и иметь разрешение на подключение от сервера БД.
Итак, решение ваших проблем зависит от того, что вы делаете, и вы предоставили много кода, но не актуальной информации.
Все это подробно описано в документации по продукту, и у вас не должно возникнуть никаких проблем при использовании MSDN: - Основы безопасности WCF - Делегирование и выдача себя за другое лицо в WCF - Рекомендации по безопасности WCF
Вы не показываете, где на самом деле открываете соединение. Похоже, закрыли.