Назад | Перейти на главную страницу

Приложение WCF развертывается в IIS, но соединение с базой данных SQL Server не работает

Я новичок в 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), тогда поток имеет учетные данные вызывающего и ограниченное делегирование происходит для аутентификации на удаленном сервере БД. Какие бы учетные данные ни использовались, они должны быть доверенными и иметь разрешение на подключение от сервера БД.

Итак, решение ваших проблем зависит от того, что вы делаете, и вы предоставили много кода, но не актуальной информации.

  • вы выдаете себя за другое лицо?
  • если ваша служба WCF не олицетворять вызывающего, тогда пулу приложений, настроенному для запуска службы WCF под IIS, должно быть предоставлено необходимое разрешение для подключения к базе данных.
    • если ваш пул приложений WCF использует учетную запись домена, предоставьте разрешение на БД учетной записи домена
    • если ваш пул приложений WCF использует локальную учетную запись, а БД размещена на том же хосте, что и IIS, тогда локальной учетной записи необходимо предоставить разрешение на подключение
    • если ваш пул приложений WCF использует локальную учетную запись, а БД удалена от узла IIS, вы не можете подключиться (зеркальные учетные записи не a поддерживаемый вариант)
    • если ваш пул приложений WCF использует LocalSystem или NETWORK SERVICE, а БД удалена от IIS, тогда учетной записи компьютера узла IIS должно быть предоставлено разрешение
    • если ваш пул приложений WCF использует LocalSystem или NETWORK SERVICE, а БД является локальной, тогда учетной записи localsystem необходимо предоставить разрешение
    • если ваш пул приложений WCF использует LOCAL SERVICE, а DB - это rmeote из IIS, вы не можете подключиться
  • если WCF олицетворяет себя, а БД является локальной, вам необходимо разрешить подключение к вызывающему
  • если WCF олицетворяет, а DB - rmeote, вам необходимо предоставить соединение с вызывающим и настроить ограниченное делегирование.

Все это подробно описано в документации по продукту, и у вас не должно возникнуть никаких проблем при использовании MSDN: - Основы безопасности WCF - Делегирование и выдача себя за другое лицо в WCF - Рекомендации по безопасности WCF

Вы не показываете, где на самом деле открываете соединение. Похоже, закрыли.