c# - 如何将参数传递给 WCF 数据服务并根据它切换连接字符串?

标签 c# asp.net entity-framework connection-string wcf-data-services

我有一个 WCF 数据服务,它运行良好。但现在我希望它能够根据我的数据服务的消费者发送的参数使用不同的数据库。

具体的例子:美国的一个使用数据服务的客户端将'US'作为参数传递,因此数据服务使用美国数据库。来自比利时的另一个使用数据服务的客户端将“BE”作为参数传递,因此数据服务使用 BE 数据库。当然,所有数据库都具有相同的模式。

目前我的客户使用这样的数据服务:

var qclient = new QueryServiceReference.Complaint_Entities(new Uri("http://localhost:60642/QueryService.svc"));

但是怎么可能给它加一个参数呢?以及如何在数据服务中查看这个参数?

所以我的问题是:如何将参数传递给 WCF 数据服务?

编辑:我找到了一种方法,但我不知道这是否是最好的方法。在执行请求之前,我将参数添加到请求 header 中:

 var qclient = new QueryServiceReference.Complaint_Entities(new Uri("http://localhost:60642/QueryService.svc"));
 qclient.SendingRequest += new EventHandler<System.Data.Services.Client.SendingRequestEventArgs>(qclient_SendingRequest);
 var cat = qclient.Categories.ToList();

static void qclient_SendingRequest(object sender, System.Data.Services.Client.SendingRequestEventArgs e)
{
   e.RequestHeaders.Add("Culture", "nl-BE");            
}

在数据服务中,我可以用它来设置连接字符串:

protected override Complaint_Entities CreateDataSource()
{
    var culture = HttpContext.Current.Request.Headers["Culture"];   
    // set connectionString based on culture
    return new Complaint_Entities(connectionString);    
}

谢谢, 大号

最佳答案

终于找到了方法,这里是方法。

客户端必须在进行查询之前发送参数,他可以通过将其添加到请求 header 来完成,如下所示:

  var client = new QueryServiceReference.Complaint_Entities(new Uri("http://localhost:60642/QueryService.svc"));
  client.SendingRequest += (o, eventArgs) => eventArgs.RequestHeaders.Add("Culture", "nl-BE");
  var result = client.Categories.ToList();

在数据服务中,您可以通过重写 CreateDataSource 方法,根据此参数设置要使用的连接字符串:

public class QueryService : DataService<Complaint_Entities>
{
    protected override Complaint_Entities CreateDataSource()
    {
        var culture = HttpContext.Current.Request.Headers["Culture"];
        string connectionStringName = string.Format("name=Complaint_Entities_{0}", culture);
        return new Complaint_Entities(connectionStringName);
    }
}

关于c# - 如何将参数传递给 WCF 数据服务并根据它切换连接字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8445376/

相关文章:

c# - 网络服务中的其他方法未显示

c# - 从数据库配置中的连接字符串中删除 SSIS 密码

c# - 数据注释 - 根据代码中的条件删除实体验证

C# DateTime Parse 以 ISO 格式减去一天

c# - RazorViewEngine.FindPartialView 使用缓存。它有什么作用?

c# - 为什么 TimeSpan.TotalHours 计算不正确?

.Net Entity Framework 的 PHP 等价物

c# - 有 {} 运算符吗?

c# - 有没有关于在没有默认 ASP.Net 成员提供程序的情况下创建 MVC3 登录系统的教程?

asp.net - 如何在 ASP.NET Response 中传递大文件?