You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

我来帮你搞定这个遗留Silverlight项目的问题!既然你已经能从InitParams拿到数据库连接标识了,接下来把它传给DomainService主要有两个实用的方法,看你需求选:

方法1:自定义DomainContext构造函数传参

这个方法适合你希望在实例化DomainContext时就明确传递连接信息的场景:

  1. 在Silverlight项目的DomainContext类里,新增一个带连接名称参数的构造函数,把参数存起来:
public class MyDomainContext : DomainContext
{
    public MyDomainContext(string connectionName) : base()
    {
        ConnectionName = connectionName;
    }

    public string ConnectionName { get; private set; }
}
  1. 在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执行数据操作就行
}
  1. 服务端DomainService调用时,可以把连接名称作为操作方法的参数传递,或者结合请求上下文传递信息(不过更推荐下面的方法2)。
方法2:通过自定义HTTP头传递(更优雅)

这个方法不需要修改DomainContext的构造,而是在请求层面传递连接信息,适合全局切换数据库的场景:

  1. 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);
    };
}
  1. 服务端的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:06:34