为范围界定问题声明通用服务引用客户端对象

时间:2014-02-19 06:24:17

标签: c# web-services

我在web.config中有这个                                         

如果这个值是实时的,那么我想调用实时Web服务,如果不是,那么我想调用测试Web服务。

在我的代码中,我想做这样的事情:

if (System.Configuration.ConfigurationManager.AppSettings["runMode"] == "live")
{
    var client = new CallStatusAvailability.ServiceReference1
                                           .StatusAvailabilityRoomsClient();
}
else
{
    var client = new CallStatusAvailability.StatusAvailabilityRooms
                                           .StatusAvailabilityRoomsClient();
}

using (client)
{
  ...... lots of logic
}

问题是客户端超出了范围。我希望能够在if语句之前声明客户端,但不确定我能将它定义为什么?

我可以将using语句放在if或else语句中,但我必须复制两者中的所有逻辑。

起初我尝试创建一个可以从if和else调用的函数,然后传入客户端,但后来我面临同样的问题,即将输入客户端变量声明为什么类型,作为输入功能

2 个答案:

答案 0 :(得分:1)

我建议您不要将两个服务引用添加到项目中,而是添加单个服务引用(可能是测试服务),并使用配置转换更改连接参数。您可以通过将基础web.config设置为连接到测试服务来执行此操作,然后在web.Release.config中添加转换以在使用Release目标部署时更改绑定。这将简化您的逻辑,使您不需要if-else构造,并允许您在using语句中创建客户端。

答案 1 :(得分:0)

你的问题是var声明了一个变量。如果需要以这种方式使用变量,则不能使用var,因为它需要在更高的范围级别声明。只需将您的声明移动到包含块即可。这假设服务引用使用相同的类型;如果没有,您需要先修复它,或者如果它们在语义上相同则使用动态。你也不能在这种情况下使用使用,必须最后使用try catch。

要使用相同的类型,我建议使用频道工厂或使用svcutil生成代理,以便您的类型对于不同的服务引用是相同的。

CallStatusAvailability.ServiceReference1.StatusAvailabilityRoomsClient client = null;
try
{

   if (System.Configuration.ConfigurationManager.AppSettings["runMode"] == "live")
   {
       client = new CallStatusAvailability.ServiceReference1.StatusAvailabilityRoomsClient();
   }
   else
   {
       client = new CallStatusAvailability.StatusAvailabilityRooms.StatusAvailabilityRoomsClient();
   }
}
catch(..){}
finally 
{ 
    client.Dispose();
}