如何将连接字符串名称从 Silverlight 应用程序传递到 DomainService
How to pass connection string name from Silverlight Application to DomainService
首先我想说我不是 SL 开发者。我只需要修改一个遗留的 Silverlight 5 应用程序。
它正在使用 RIA 服务并且 XAP 托管在 Asp.Net 页面中。
登录页面上的用户输入凭据并能够从下拉列表中 select 数据库。整个网络正在使用多个连接,用户能够 select 数据库进行连接。
这个 selected 数据库(或任何数据连接标识符)被发送到 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 来存储 selected 数据库。我在某个地方找到了它作为一种可能的解决方案。但它需要改变。
好的,那么我们有 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 的某个地方获取连接字符串吗?
好的,我就是这样做的
我将选定的数据库作为用户身份的一部分。因为我用的是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);
}
首先我想说我不是 SL 开发者。我只需要修改一个遗留的 Silverlight 5 应用程序。
它正在使用 RIA 服务并且 XAP 托管在 Asp.Net 页面中。
登录页面上的用户输入凭据并能够从下拉列表中 select 数据库。整个网络正在使用多个连接,用户能够 select 数据库进行连接。
这个 selected 数据库(或任何数据连接标识符)被发送到 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 来存储 selected 数据库。我在某个地方找到了它作为一种可能的解决方案。但它需要改变。
好的,那么我们有 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 的某个地方获取连接字符串吗?
好的,我就是这样做的
我将选定的数据库作为用户身份的一部分。因为我用的是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);
}