Строка подключения на пользователя с WCF Services - PullRequest
0 голосов
/ 27 декабря 2011

Мы разрабатываем приложение ASP.NET MVC с сервисами WCF. Проблема в том, что нам нужно интегрировать приложение со стандартной моделью безопасности компании.

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

Мы выясняем, как лучше всего передать эту строку подключения службам wcf. Кто-то из моей команды предлагает сохранить это соединение в сеансе и отправлять его в службу в каждом сообщении, возможно, используя некоторую расширяемость WCF для автоматической передачи этого соединения.

Еще предложения?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

Вы можете использовать InstanceContextMode.PerSession в службе WCF, чтобы совместно использовать один раз созданный экземпляр соединения со всеми вызовами службы в сеансе, а когда вы закончите, вы можете удалить соединение, вызвав метод DisposeConnection ().

Надеюсь, это поможет вам!

Пример:

 [ServiceContract]
 public interface IConnectionService
 {
     [OperationContract]
     void InitSqlConnection(string UserName, string passWord);

     [OperationContract]
     void DisposeSqlConnection();

     [OperationContract]
     string GetUserAccounts();

     [OperationContract]
     string GetUserRoles();

}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class ConnectionService : IConnectionService
    {

        SqlConnection connection;

        public void InitSqlConnection(string UserName, string passWord)
        {
            if (connection == default(SqlConnection))
            {
                connection = new SqlConnection(string.Format("Data Source=.;Initial Catalog=WADB;User Id={0};Password={1};", UserName, passWord));
                connection.Open();
            }
        }

        public void DisposeSqlConnection()
        {
            if (connection != default(SqlConnection))
            {
                connection.Close();
                connection.Dispose();
            }
        }

        public string GetUserAccounts()
        {
            string data = string.Empty;
            if (connection != default(SqlConnection))
            {
                //// do database operation with "connection"
                SqlDataAdapter da = new SqlDataAdapter("select * from tblUserAccount", connection);
                DataSet ds = new DataSet();
                da.Fill(ds);
                data = ds.GetXml();
            }
            return data;
        }

        public string GetUserRoles()
        {
            string data = string.Empty;
            if (connection != default(SqlConnection))
            {
                //// do database operation with "connection"
                SqlDataAdapter da = new SqlDataAdapter("select * from tblUserRole", connection);
                DataSet ds = new DataSet();
                da.Fill(ds);
                data = ds.GetXml();
            }
            return data;
        }
}
0 голосов
/ 27 декабря 2011

Я использовал собственный заголовок мыла для передачи данных сеанса, и этот подход был очень успешным в нашей производственной среде.Это довольно просто.

...