我在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调用的函数,然后传入客户端,但后来我面临同样的问题,即将输入客户端变量声明为什么类型,作为输入功能
答案 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();
}