Как передать параметр в службу данных WCF и переключить строку подключения на его основе? - PullRequest
4 голосов
/ 09 декабря 2011

У меня есть служба данных 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

Ответы [ 5 ]

3 голосов
/ 09 декабря 2011

Наконец-то нашел, как это сделать, вот как.

Клиент должен отправить параметр перед выполнением запроса, что он может сделать, добавив его в заголовок запроса следующим образом:

  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);
    }
}
1 голос
/ 09 декабря 2011

Да, это вполне возможно. Вы можете добавить имя к каждой имеющейся у вас строке подключения, а затем выбрать эту строку подключения на основе переданной переменной.

// В вашем 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
}
0 голосов
/ 09 декабря 2011

Это довольно просто, все, что вам нужно сделать, это создать правильный контекст данных в зависимости от значения параметра:

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

Однако, есть предостережение и это аутентификация .

Вам необходимо разработать механизм аутентификации ваших запросов, чтобы пользователи в США не могли создавать запросы к базе данных BE и наоборот.

0 голосов
/ 09 декабря 2011

WCF ничего не делает, если вы, как разработчик, не пишете в нем код. Таким образом, вы отвечаете за все в WCF .

Для этого просто проверьте переменную в URL:

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

Теперь вы можете загрузить строку подключения из вашего файла web.config на основе значения countryCode и соответственно установить строку подключения вашего уровня доступа к данным.

0 голосов
/ 09 декабря 2011

Вы можете, если речь идет о обычной службе данных, где вы создаете собственное соединение. В файле web.config сохраните имя сервера в качестве токена, скажем% DBSERVER%, и замените его на ipaddress или имя сервера на основе запроса.

...