2015-01-07 19 views
0

我正在使用Oracle DataAccess(最后一个),我内部有很多数据库用户。所以,我想在我的客户端应用程序(WPF)中创建connectionString并将其传递给服务器。我做我的服务器如下:修改WCF数据服务中的connectionString 5.6

protected override POSContext CreateDataSource() 
{ 
    HttpRequest req = HttpContext.Current.Request; 

    if (req.Headers != null && Array.FindIndex(req.Headers.AllKeys, c=>c.Equals("db", StringComparison.OrdinalIgnoreCase)) > 0) 
    { 
     string database = req.Headers["db"]; 
     string user = req.Headers["user"]; 
     string pass = req.Headers["pass"]; 

     StringBuilder conexion = new StringBuilder(); 
     conexion.Append("DATA SOURCE="); 
     conexion.Append(database); 
     conexion.Append(";USER ID="); 
     conexion.Append(user); 
     conexion.Append(";PASSWORD="); 
     conexion.Append(pass); 

     if (!string.IsNullOrEmpty(conexion.ToString())) 
      return new POSContext(conexion.ToString()); 
    } 

    return null;//new POSContext(); 
} 

在客户端,我有以下代码:

var context = new POS.DataServices.POSContext(new Uri(Storage.Current.UrlService)); // Something like this http://localhost/POService.svc 
context.BuildingRequest += (s, args) => //Or SendingRequest2 produces the same result 
{ 
    args.Headers.Add("db", Storage.Current.Configuraciones.DB); 
    args.Headers.Add("user", Storage.Current.Configuraciones.UserName); 
    args.Headers.Add("pass", Storage.Current.Configuraciones.Password); 
}; 

MessageBox.Show(proxy.POS_CIUDAD.ToList().FirstOrDefault().CIU_DESC); //Alert the city name 

当我调试我的应用程序有一个错误(请求错误)。我的客户端代码试图先显示消息,然后转到BuildingRequest。如何在实体调用之前传递connectionString?

+0

任何连接字符串?用Oracle来做这件事是不可能的? –

回答

0

CreateDataSource在服务启动时被调用一次,这就是为什么你会在那里得到错误。

我想你可以尝试以下方法:

  1. 添加一个连接字符串的属性上POSContext,并给POSContext参数的构造函数。这是连接字符串可以稍后设置。也许你需要确保连接只在连接字符串准备就绪时设置。
  2. 覆盖OnStartProcessingRequest方法,并改变CurrentDataSource(POSContext类)