侧边栏壁纸
博主头像
johnliu博主等级

远离世上乱纷纷,清静凡心不染尘。 闲看山前腾紫气,静观天外涌祥云。 花间酌酒邀明月,柳下吟诗论古今。 坐卧随心天地近,悠然细品玉堂春。

  • 累计撰写 35 篇文章
  • 累计创建 10 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Silverlight 动态配置WebService

冰灬夏
2019-08-14 / 0 评论 / 0 点赞 / 9 阅读 / 4088 字
温馨提示:
本文最后更新于 2024-05-27,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Silverlight 动态配置WebService

我们知道,在silverlight中对service(web service,wcf)添加引用后,会产生一个config文件: ServiceReferences.ClientConfig.

如下所示:

<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_Wcf_GetData"
maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint
address="http://localhost:1522/CH10/Wcf_GetData.svc"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_Wcf_GetData"
contract="WcfGetDataProxy.Wcf_GetData"
name="BasicHttpBinding_Wcf_GetData" />
</client>
</system.serviceModel>
</configuration>


可以看到,这个config中配置了service的一些信息:地址,绑定类型等。这样在实例化服务时候,默认会到此config中读取相关节点信息...
但是这样有几个缺点:
1.本地开发与发布版本时候,需要重新配置文档,并编译才可。【地址位置发生了改变】
2.不安全。client端可以在IE临时文件夹中找到silverlight本地备份,xx.xap文件,可以轻松解包,看到此config文件,并获悉service地址信息....
为了避免这些问题,我们可以利用实例化服务时,服务的几个构造函数的重载函数来实现。 也就是说我们在实例化时,明确指出service的地址等信息,而不是到默认的config中查找。 可以自定义一个class,对config中的节点进行实例化,并返回特定信息,从而可以删除config文件,起到client端安全的作用。
自定义服务类别

public class ServiceUtil {
/// <summary>
/// 调用远端Web service
/// </summary>
/// <returns></returns>
public static ISDApp01Xml.SDApp01XmlSoapClient GetDynamicClient() {
//BasicHttpBinding 定义
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;
//Endpoind 定义
EndpointAddress client = new EndpointAddress(GetHostUrl());
//返回web service实例:注意这里利用了服务的构造函数的重载
return new ISDApp01Xml.SDApp01XmlSoapClient(binding,client);
}
/// <summary>
/// 调用本地Web service
/// </summary>
/// <returns></returns>
public static myService.myServiceSoapClient GetmyService() {
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;
//取得web service路径
EndpointAddress client = new EndpointAddress((
new Uri(Application.Current.Host.Source, "../myService.asmx")));
return new myService.myServiceSoapClient(binding, client);
}
public static string GetHostUrl() {
//指定web service路径
return "http://webtest/WebServices/myService.asmx";
}
}
silverlight调用:
public partial class Demo012 : UserControl {
public Demo012() {
InitializeComponent();
setBind();
}
private void setBind()
{
myService.myServiceSoapClient client= ServiceUtil.GetDynamicClient();
string sql = "SELECT ID,NAME FROM PDM_BASIC_INFO";
client.ExecuteQueryAsync(sql);
client.ExecuteQueryCompleted += (sender2, e2) => {
if (e2.Error == null) {
dgshow.ItemsSource = from item in e2.Result.Descendants("row") select new BasicInfo {
ID = (int)item.Attribute("ID"), Name = (string)item.Attribute("NAME") };
}
};
myService.myServiceSoapClient wc = ServiceUtil.GetmyService();
wc.sayHelloAsync();
wc.sayHelloCompleted += (sender1, e1) => { MessageBox.Show(e1.Result); }; } }
public class BasicInfo {
public int ID { set; get; }
public string Name { set; get; }
}


0

评论区