none
根据[ServiceReferences.ClientConfig],但不依赖其服务地址创建Wcf服务客户端。 RRS feed

  • 问题

  •     /// <summary>
        /// T4WcfHelper,创建Wcf服务客户端辅助类。
        /// </summary>
        public static class T4WcfHelper
        {
            /// <summary>
            /// CreateWcfClient,
            /// 利用配置文件[ServiceReferences.ClientConfig]并合理替换其服务地址,创建创建Wcf服务客户端。
            /// 注:替换配置文件【终结点[Endpoint]】中的【主机(host)和端口(port)】为xap包所在的【主机(host)和
            /// 端口(port)】后,创建Wcf服务客户端。从而,达到免去发布Silverlight应用时手动修改配置文件的目地。
            /// </summary>
            /// <typeparam name="TServiceClient"></typeparam>
            /// <returns></returns>
            public static TServiceClient CreateWcfClient<TServiceClient>()
                where TServiceClient : class,new()
            {
                var BdFlag = BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase;
                var ClientInst = new TServiceClient();
                var EndpointProp = ClientInst.GetType().GetProperty("Endpoint", BdFlag);
                var EndpointValue = EndpointProp.GetValue(ClientInst, null) as ServiceEndpoint;
                var UbCfg = new UriBuilder(EndpointValue.Address.Uri);
                var UbHost = new UriBuilder(Application.Current.Host.Source.AbsoluteUri);
                UbCfg.Host = UbHost.Host; UbCfg.Port = UbHost.Port;
                EndpointValue.Address = new EndpointAddress(UbCfg.Uri, EndpointValue.Address.Headers.ToArray());
                return ClientInst;
            }

            /// <summary>
            /// ChangeWcfAddressToXap。
            /// 将Wcf服务客户端地址修改为参照xap文件的地址。
            /// </summary>
            /// <typeparam name="TChannel"></typeparam>
            /// <param name="Src"></param>
            public static void ChangeWcfAddressToXap<TChannel>(this ClientBase<TChannel> Src)
                where TChannel : class
            {
                var EndpointValue = Src.Endpoint;
                var UbCfg = new UriBuilder(EndpointValue.Address.Uri);
                var UbHost = new UriBuilder(Application.Current.Host.Source.AbsoluteUri);
                UbCfg.Host = UbHost.Host; UbCfg.Port = UbHost.Port;
                Src.Endpoint.Address = new EndpointAddress(UbCfg.Uri, EndpointValue.Address.Headers.ToArray());
            }
        }

        /// <summary>
        /// T4WcfHelper,测试T4WcfHelper。
        /// </summary>
        public class TestT4WcfHelper
        {
            /// <summary>
            /// 测试CreateWcfClient。
            /// </summary>
            private static void TestCreateWcfClient()
            {
                // 假设:应用程序主目录
                //   1.1)开发调试时为:http://localhost:1352/TestApp.Web/
                //   1.2)发布应用时为:http://www.TestSite.com/TestApp.Web/
                // 要求:Service1Client服务地址
                //   2.1)开发调试时为:http://localhost:1352/TestApp.Web/Services/Service1.svc
                //   2.2)发布应用时为:http://www.TestSite.com/TestApp.Web/Services/Service1.svc


                // 1)依赖[ServiceReferences.ClientConfig]配置文件中服务地址,创建服务端。
                // Svc1中的地址将为[2.1)],不符合要求。
                var Svc1 = new ServiceReference1.Service1Client();

                // 1)替换[ServiceReferences.ClientConfig]配置文件中服务地址,创建服务端。
                // Svc2中的地址将为[2.2)],符合要求,这是符合要求的方法1。
                var Svc2 = T4WcfHelper.CreateWcfClient<ServiceReference1.Service1Client>();

                // 3)替换[ServiceReferences.ClientConfig]配置文件中的服务地址,创建服务端。
                // Svc3中的地址将为[2.2)],符合要求,这是符合要求的方法2。。
                var Svc3 = new ServiceReference1.Service1Client(); Svc3.ChangeWcfAddressToXap();
            }
        }

    • 已编辑 TFSoft 2013年6月22日 14:27
    2013年6月21日 15:56

全部回复

  • 请问下,你在这个位置的

    EndpointValue.Address = new EndpointAddress(UbCfg.Uri, EndpointValue.Address.Headers.ToArray());

    我怎么调用不出ToArray()这个属性呢?

    2013年8月27日 15:35