官术网_书友最值得收藏!

2.3.2 邏輯地址和物理地址

在WCF中,每個(gè)終結(jié)點(diǎn)都包含兩個(gè)不同的地址:邏輯地址和物理地址。邏輯地址就是以終結(jié)點(diǎn)Address屬性表示的地址。至于物理地址,對(duì)于消息發(fā)送端來(lái)講,就是消息被真正發(fā)送的目的地址;而對(duì)于消息的接收端來(lái)講,就是監(jiān)聽(tīng)器真正監(jiān)聽(tīng)的地址。按照WS-Addressing的說(shuō)法,邏輯地址和物理地址分別對(duì)應(yīng)著地址To和Via。

服務(wù)端邏輯地址與物理地址

對(duì)于消息接收方的終結(jié)點(diǎn)來(lái)講,物理地址就是監(jiān)聽(tīng)地址,通過(guò)ServiceEndpoint的ListenUri表示。

        public class ServiceEndpoint
        {
            //其他成員
            public Uri ListenUri { get; set; }
        }

在對(duì)服務(wù)進(jìn)行寄宿的時(shí)候,可以調(diào)用ServiceHostBase或ServiceHost的AddServiceEndpoint對(duì)應(yīng)的重載來(lái)為添加的終結(jié)點(diǎn)指定ListenUri。在下面的代碼中,為終結(jié)點(diǎn)指定了一個(gè)不同于邏輯地址的物理地址(ListenUri)。

        public abstract class ServiceHostBase : CommunicationObject,
        IExtensibleObject<ServiceHostBase>, IDisposable
        {
            //其他成員
            public ServiceEndpoint AddServiceEndpoint(string implementedContract,
              Binding binding, string address, Uri listenUri);
            public ServiceEndpoint AddServiceEndpoint(string implementedContract,
              Binding binding, Uri address, Uri listenUri);
        }
        public class ServiceHost : ServiceHostBase
        {
            //其他成員
            public ServiceEndpoint AddServiceEndpoint(Type implementedContract,
              Binding binding, string address, Uri listenUri);
            public ServiceEndpoint AddServiceEndpoint(Type implementedContract,
              Binding binding, Uri address, Uri listenUri);
        }
        using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService)))
        {
            serviceHost.AddServiceEndpoint(typeof(ICalculator),new WSHttpBinding(),
              "http://127.0.0.1:9999/CalculatorService",
              new Uri ("http://127.0.0.1:8888/CalculatorService"));
            Console.Read();
        }

當(dāng)然,ListenUri也可以通過(guò)配置進(jìn)行指定,下面的配置和上面的代碼是等效的。

        <configuration>
            <system.serviceModel>
                <services>
                  <service name="Artech.WcfServices.Services.CalculatorService">
                        <endpoint  binding="wsHttpBinding"
                            contract="Artech.WcfServices.Contracts.ICalculator"
                              address="http://127.0.0.1:8888/CalculatorService"
                            listenUri="http://127.0.0.1:8888/CalculatorService" />
                  </service>
                </services>
            </system.serviceModel>
        </configuration>

客戶(hù)端邏輯地址與物理地址

前面已提到,對(duì)于消息的發(fā)送端來(lái)講,物理地址其實(shí)就是消息發(fā)送的真正目的地址。該地址通過(guò)一個(gè)特殊的終結(jié)點(diǎn)行為(EndpointBehavior)來(lái)指定:ClientViaBehavior。ClientViaBehavior定義的URI代表該物理地址。

        public class ClientViaBehavior : IEndpointBehavior
        {
            //其他成員
            public Uri Uri { get; set; }
        }

同一般的終結(jié)點(diǎn)行為一樣,ClientViaBehavior通過(guò)相應(yīng)的配置應(yīng)用到WCF客戶(hù)端運(yùn)行時(shí)。在下面的配置中,通過(guò)viaUri設(shè)置了一個(gè)不同于終結(jié)點(diǎn)地址(http://127.0.0.1:9999/CalculatorService)的物理地址:http://127.0.0.1:8888/CalculatorService

        <?xml version="1.0" encoding="utf-8" ?>
        <configuration>
            <system.serviceModel>
                <behaviors>
                  <endpointBehaviors>
                        <behavior name="clientViaBehavior">
                            <clientVia viaUri=
                              "http://127.0.0.1:8888/CalculatorService" />
                        </behavior>
                  </endpointBehaviors>
                </behaviors>
                <client>
                  <endpoint address="http://127.0.0.1:9999/CalculatorService"
                        behaviorConfiguration="clientViaBehavior"
                        binding="wsHttpBinding" bindingConfiguration=""
                          contract="Artech.WcfServices.Contracts.ICalculator"
                        name="CalculatorService">
                  </endpoint>
                </client>
            </system.serviceModel>
        </configuration>
主站蜘蛛池模板: 新营市| 黔南| 天祝| 石家庄市| 邓州市| 台南县| 视频| 藁城市| 启东市| 保定市| 乌拉特前旗| 武隆县| 开远市| 读书| 类乌齐县| 福泉市| 舞阳县| 东乡县| 平乐县| 江永县| 鸡泽县| 隆昌县| 穆棱市| 电白县| 牙克石市| 左权县| 亚东县| 鄂州市| 柳林县| 桂林市| 南投县| 河南省| 龙井市| 建德市| 察雅县| 贺兰县| 靖宇县| 城口县| 资中县| 松桃| 晋州市|