如何从Silverlight应用程序将连接字符串名称传递给DomainService
我来帮你搞定这个遗留Silverlight项目的问题!既然你已经能从InitParams拿到数据库连接标识了,接下来把它传给DomainService主要有两个实用的方法,看你需求选:
方法1:自定义DomainContext构造函数传参
这个方法适合你希望在实例化DomainContext时就明确传递连接信息的场景:
- 在Silverlight项目的DomainContext类里,新增一个带连接名称参数的构造函数,把参数存起来:
public class MyDomainContext : DomainContext { public MyDomainContext(string connectionName) : base() { ConnectionName = connectionName; } public string ConnectionName { get; private set; } }
- 在Application_Startup里,从InitParams取值并传入DomainContext:
private void Application_Startup(object sender, StartupEventArgs e) { // 对应你传入InitParams的键名,比如"ConnectionId" string connectionName = e.InitParams["ConnectionId"]; var domainContext = new MyDomainContext(connectionName); // 后续用这个domainContext执行数据操作就行 }
- 服务端DomainService调用时,可以把连接名称作为操作方法的参数传递,或者结合请求上下文传递信息(不过更推荐下面的方法2)。
方法2:通过自定义HTTP头传递(更优雅)
这个方法不需要修改DomainContext的构造,而是在请求层面传递连接信息,适合全局切换数据库的场景:
- Silverlight端,在创建DomainContext后,给它的DomainClient添加请求头:
private void Application_Startup(object sender, StartupEventArgs e) { string connectionName = e.InitParams["ConnectionId"]; var domainContext = new MyDomainContext(); // 强转为WebDomainClient,监听请求创建事件 var webClient = (WebDomainClient<IMyDomainServiceContract>)domainContext.DomainClient; webClient.CreatingRequest += (s, args) => { // 添加自定义请求头,名称用X-前缀避免冲突 args.WebRequest.Headers.Add("X-Connection-Name", connectionName); }; }
- 服务端的DomainService里,重写Initialize方法读取这个头,然后切换数据库连接:
public class MyDomainService : DomainService { protected override void Initialize(DomainServiceContext context) { base.Initialize(context); // 从请求头获取连接名称 string connectionName = context.OperationContext.Request.Headers["X-Connection-Name"]; if (!string.IsNullOrEmpty(connectionName)) { // 根据连接名称从Web.config获取对应的连接字符串,然后初始化数据上下文 string connString = ConfigurationManager.ConnectionStrings[connectionName].ConnectionString; this.DataContext = new MyDataContext(connString); } } }
注意事项
- 自定义头名称建议用
X-开头,避免和标准HTTP头冲突; - 如果你是跨域部署Silverlight,需要确保服务端允许这个自定义头(不过你是托管在ASP.NET页面里,同域的话不用操心);
- 方法2的优势是不需要修改每个DomainService操作方法,在初始化时就能全局切换数据库,更适合你的多连接场景。
内容的提问来源于stack exchange,提问作者Raptor
相关产品推荐
相关产品推荐

