【问题标题】:How to pass connection string name from Silverlight Application to DomainService如何将连接字符串名称从 Silverlight 应用程序传递到 DomainService
【发布时间】:2018-09-30 01:30:40
【问题描述】:

首先我想说我不是 SL 开发人员。我只需要修改一个旧版 Silverlight 5 应用程序。

它使用 RIA 服务,XAP 托管在 Asp.Net 页面中。

登录页面上的用户输入凭据并能够从下拉列表中选择数据库。整个网络正在使用多个连接,用户可以选择要连接的数据库。

这个选定的数据库(或任何用于数据连接的标识符)是通过 XAP 的 InitParams 发送的,所以我可以从 SL 访问它。

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        foreach (var item in e.InitParams)
        {
            Resources.Add(item.Key, item.Value);
        }

        var selectedConnectionString = GetInitParam("ConnectionString");

        // TODO: Different way to store connection string
        SetCookie("ConnectionString", selectedConnectionString);

        RootVisual = new LoadingPage();
    }

目前我正在尝试使用 cookie 来存储选定的数据库。我在某处发现它是一种可能的解决方案。但它需要改变。

好的,那么我们就有了 DomainService。

public class CommissionDomainService : LinqToEntitiesDomainService<CommissionEntitiesContext>
{
    ...
}

我知道我需要使用CreateObjectContext 来更改服务中的 ConnectionString。所以我有:

    protected override CommissionEntitiesContext CreateObjectContext()
    {
        // TODO: Different way to store connection string
        string connectionStringName;
        if (System.Web.HttpContext.Current.Request.Cookies["ConnectionString"] != null)
        {
            connectionStringName = System.Web.HttpContext.Current.Request.Cookies["ConnectionString"].Value;
        }
        else
        {
            throw new Exception("Missing connectionStringName");
        }

        var connectionStringSettings = ConfigurationManager.ConnectionStrings[connectionStringName];

        var entityCs = new EntityConnectionStringBuilder
        {
            Metadata = "res://*/CommissionEntities.csdl|res://*/CommissionEntities.ssdl|res://*/CommissionEntities.msl",
            Provider = connectionStringSettings.ProviderName,
            ProviderConnectionString = connectionStringSettings.ConnectionString
        };

        return new CommissionEntitiesContext(entityCs.ConnectionString);
    }

再次,我使用 Cookie 将值从应用程序传递到服务。

但这不是最好的主意。因为 cookie 和持久性等原因。

我的问题是,如何将我的 ConnectionString 值从主应用程序传递到 DomainService?或者我可以从服务访问一些应用程序上下文吗?或者我可以在 EntitiesContext 的某个地方获取连接字符串吗?

【问题讨论】:

    标签: asp.net silverlight wcf-ria-services silverlight-5.0 ria


    【解决方案1】:

    好的,我就是这样做的。

    我将选定的数据库作为用户身份的一部分。因为我用的是Owin,所以我只用了Claims之一。

    所以当用户登录时,我只对选定的数据库提出一个声明

                // build a list of claims
                var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.Name, user.Name),
                    new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
                    new Claim(ClaimTypes.UserData, selectedDatabase)
                };
    
                // create the identity
                var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationType);
    
                // sign in
                Context.GetOwinContext().Authentication.SignIn(new AuthenticationProperties { IsPersistent = false }, identity);
    

    然后在DomainService 中我使用了Initialize 和CreateObjectContext 方法

        private string _connectionStringName;
    
        public override void Initialize(DomainServiceContext context)
        {
            // Načteme z kontextu usera zvolenou databázi
            var claim = ((ClaimsIdentity)context.User.Identity).FindFirst(ClaimTypes.UserData);
            _connectionStringName = claim.Value;
    
            base.Initialize(context);
    
            ...
        }
    
    
        protected override CommissionEntitiesContext CreateObjectContext()
        {
            if (string.IsNullOrEmpty(_connectionStringName))
            {
                throw new Exception("Missing connectionStringName");
            }
    
            var connectionStringSettings = ConfigurationManager.ConnectionStrings[_connectionStringName];
    
            var entityCs = new EntityConnectionStringBuilder
            {
                Metadata = "res://*/CommissionEntities.csdl|res://*/CommissionEntities.ssdl|res://*/CommissionEntities.msl",
                Provider = connectionStringSettings.ProviderName,
                ProviderConnectionString = connectionStringSettings.ConnectionString
            };
    
            return new CommissionEntitiesContext(entityCs.ConnectionString);
        }
    

    【讨论】:

      猜你喜欢
      • 2021-01-29
      • 2014-03-13
      • 1970-01-01
      • 2013-12-22
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多