如何将连接字符串名称从Silverlight应用程序传递到DomainService

时间:2018-04-19 13:52:54

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

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

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

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

这个选定的数据库(或数据连接的任何识别器)都是通过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中的某处获取连接字符串吗?

1 个答案:

答案 0 :(得分: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中,我使用了InitializeCreateObjectContext方法

    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);
    }