我有一个 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/