Silverlight中动态获取Web Service地址
程序员文章站
2024-03-09 14:06:05
在使用wcf或者ws进行数据库操作的时候都需要有一个明确的服务地址,如果是wcf就是svc文件地址。初学者通常会直接使用vs的add service reference来添...
在使用wcf或者ws进行数据库操作的时候都需要有一个明确的服务地址,如果是wcf就是svc文件地址。初学者通常会直接使用vs的add service reference来添加引用。这的确是十分方便的手段,但是这样会带来什么样的麻烦呢?
第一,在开发的阶段一旦改变了ws文件的目录结构就必须改变sl工程中的ws地址,而且这种改变并不是单纯的update service reference这么简单,因为地址已经改变了,你必须删掉旧的reference来添加新的reference,这是其一。
第二, 当项目开发完成要部署上去服务器时大问题就来了。如果在开发的时候是用vs的add service reference来添加引用的话,系统会自动生成一个servicereferences.clientconfig的配置文件,里面记录着ws的地址和缓存、连接时长之类的信息,要命的是这个配置文件是连同sl工程一并打包进xap文件里面的,也就是说一旦项目部署到了服务器上之后就不能再改ws的地址了。这对项目的迁移,服务器ip地址的变动都带来十分不利的影响。
这里介绍一种动态获取ws地址的方法,这种方法不依赖于 servicereferences.clientconfig文件。虽然说不依赖于配置文件,但是开发者仍然需要使用vs的add service reference来添加一次引用,用于生成sl端的操作代码。好了,进入正题,下面是用于生成wsclient的类
public class serviceutil
{
public static string svcpath { set; get; }
/// <summary>
/// get data service path
/// </summary>
/// <returns>path</returns>
public static workflowserviceclient getdynamicclient()
{
if (svcpath == null)
throw new exception("wrong svc path!");
basichttpbinding binding = new basichttpbinding(application.current.host.source.scheme.equals("https", stringcomparison.invariantcultureignorecase) ? basichttpsecuritymode.transport : basichttpsecuritymode.none);
binding.maxreceivedmessagesize = int.maxvalue;
binding.maxbuffersize = int.maxvalue;
return new workflowserviceclient(binding, new endpointaddress(new uri(application.current.host.source, svcpath)));
}
}
上面serviceutil类中有一个静态的字符串变量,用来保存ws文件路径;然后下面的getdynamicclient方法就是把sl应用的宿主网站uri与ws文件路径组合起来形成完整的ws引用url。这里这个静态变量svcpath通常是在使用ws操作前赋值,而具体的值可以通过网站web.config文件的appsetting中字段中传过来,至于怎么在sl工程中获取aspx页面的参数的问题,我在上一篇随笔中有写到,大家可以参考一下。
第一,在开发的阶段一旦改变了ws文件的目录结构就必须改变sl工程中的ws地址,而且这种改变并不是单纯的update service reference这么简单,因为地址已经改变了,你必须删掉旧的reference来添加新的reference,这是其一。
第二, 当项目开发完成要部署上去服务器时大问题就来了。如果在开发的时候是用vs的add service reference来添加引用的话,系统会自动生成一个servicereferences.clientconfig的配置文件,里面记录着ws的地址和缓存、连接时长之类的信息,要命的是这个配置文件是连同sl工程一并打包进xap文件里面的,也就是说一旦项目部署到了服务器上之后就不能再改ws的地址了。这对项目的迁移,服务器ip地址的变动都带来十分不利的影响。
这里介绍一种动态获取ws地址的方法,这种方法不依赖于 servicereferences.clientconfig文件。虽然说不依赖于配置文件,但是开发者仍然需要使用vs的add service reference来添加一次引用,用于生成sl端的操作代码。好了,进入正题,下面是用于生成wsclient的类
复制代码 代码如下:
public class serviceutil
{
public static string svcpath { set; get; }
/// <summary>
/// get data service path
/// </summary>
/// <returns>path</returns>
public static workflowserviceclient getdynamicclient()
{
if (svcpath == null)
throw new exception("wrong svc path!");
basichttpbinding binding = new basichttpbinding(application.current.host.source.scheme.equals("https", stringcomparison.invariantcultureignorecase) ? basichttpsecuritymode.transport : basichttpsecuritymode.none);
binding.maxreceivedmessagesize = int.maxvalue;
binding.maxbuffersize = int.maxvalue;
return new workflowserviceclient(binding, new endpointaddress(new uri(application.current.host.source, svcpath)));
}
}
上面serviceutil类中有一个静态的字符串变量,用来保存ws文件路径;然后下面的getdynamicclient方法就是把sl应用的宿主网站uri与ws文件路径组合起来形成完整的ws引用url。这里这个静态变量svcpath通常是在使用ws操作前赋值,而具体的值可以通过网站web.config文件的appsetting中字段中传过来,至于怎么在sl工程中获取aspx页面的参数的问题,我在上一篇随笔中有写到,大家可以参考一下。