簡體   English   中英

如何將參數傳遞給WCF數據服務並根據它來切換連接字符串?

[英]How can I pass a parameter to a WCF Data Service and switch connection string based on it?

我有一個WCF數據服務,工作正常。 但現在我希望它能夠使用基於我的數據服務的使用者發送的參數的不同數據庫。

具體示例:來自美國的使用數據服務的客戶端將“US”作為參數傳遞,因此數據服務使用美國數據庫。 來自比利時的另一個使用數據服務的客戶端將“BE”作為參數傳遞,因此數據服務使用BE數據庫。 當然,所有數據庫都具有相同的模式。

目前我的客戶端使用數據服務,如:

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

但是如何為此添加參數呢? 如何在數據服務中檢查此參數?

所以我的問題是:如何將參數傳遞給WCF數據服務?

編輯:我找到了一種方法,但我不知道這是否是最好的方法。 在執行請求之前,我將參數添加到請求標頭:

 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);    
}

謝謝,L

終於找到了怎么做,這是怎么回事。

客戶端必須在執行查詢之前發送參數,他可以通過將其添加到請求標頭來執行此操作,如下所示:

  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);
    }
}

是的,這是完全可能的。 您可以為每個連接字符串添加一個名稱,然后根據傳遞的變量選擇該連接字符串。

//在你的web.config中

<connectionStrings>
    <add name="OracleDefault" connectionString="DATA SOURCE=G14DEV;PASSWORD=Password;USER ID=UserId; Provider=OraOLEDB.Oracle;" providerName="Oracle.DataAccess.Client"/>
    <add name="ApplicationDefault" connectionString="DATA SOURCE=G14DEV;PASSWORD=Password;USER ID=UserId; Provider=OraOLEDB.Oracle;" providerName="Oracle.DataAccess.Client"/>
<connectionStrings>

//在你的代碼中

public void Connect(string user)
{
    switch(user)
    {
        case "Default":
        {
            m_connectionString = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ConnectionString;
            break;
        }
        case "Oracle":
        {
            m_connectionString = ConfigurationManager.ConnectionStrings["OracleDefault"].ConnectionString;

            break;
        }
    }

    //now connect to the database
}

如果您正在談論創建自己的連接的普通數據服務,則可以。 在web.config中,將服務器名稱保留為令牌,例如%DBSERVER%,並根據請求將其替換為ipaddress或服務器名稱。

如果開發人員不在其中編寫代碼,則WCF不執行任何操作。 因此, 您負責WCF中的所有內容

為此,只需檢查URL中的變量:

string countryCode = Request["country-code"]; 
// countryCode may be something like 'US'

現在,您可以根據countryCode的值從web.config文件加載連接字符串,並相應地設置數據訪問層的連接字符串。

這很簡單,您只需根據參數值創建正確的數據上下文:

switch ( parameterValue ) {
   case "US" : datacontext = new ....( "US connectionstring" );
   case "EN" : datacontext = new ....( "BE connectionstring" );
}

但是,有一個警告,它的身份驗證

您必須設計一種機制來驗證您的請求,以便美國用戶無法向BE數據庫發出請求,反之亦然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM