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; }
    }

转载于:https://www.cnblogs.com/WormCanFly/archive/2009/06/18/1506125.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值