WCF系列:服務的發佈和使用

客戶端直接引用契約類庫,現實中可能因爲開發團隊或語言等原因,客戶端不能直接引用契約類庫,這就需要服務端公佈自己的契約、客戶端發現契約。

服務端:

服務端通過配置服務行爲,以元數據的形式公佈服務。可以使用配置文件也可以使用代碼。

1、使用配置文件:

將之前的WCFDemo.Host.WithConfig項目的配置文件用WCF服務配置編輯器打開,新建服務行爲配置:

這裏就用默認的Name,實際項目中起個好聽的名字吧☺

添加服務元數據:

設置元數據的HttpGetEnabledHttpGetUrl

選擇服務,設置其BehaviorConfiguration爲剛添加的服務行爲:

保存後的配置文件:

複製代碼
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="NewBehavior0">
                    <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:5678/DemoService/metadata" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="NewBehavior0" name="WCFDemo.Services.DemoService">
                <endpoint address="http://localhost:5678/DemoService" binding="basicHttpBinding"
                    bindingConfiguration="" contract="WCFDemo.Contracts.IDemoService" />
            </service>
        </services>
    </system.serviceModel>
</configuration>
複製代碼

使用配置文件的方式,程序代碼不需要任何修改。

2、代碼方式:

WCFDemo.Host.WithoutConfig項目的啓動服務代碼處添加服務行爲的處理代碼:

複製代碼
            host = new ServiceHost(typeof(DemoService));
          host.AddServiceEndpoint(typeof(IDemoService), new BasicHttpBinding(), "http://localhost:5678/DemoService");
          ServiceMetadataBehavior b = new ServiceMetadataBehavior();
 b.HttpGetEnabled = true;
 b.HttpGetUrl = new Uri("http://localhost:5678/DemoService/metadata");
 host.Description.Behaviors.Add(b);
          host.Opened += delegate { label1.Text = "服務啓動"; };
          host.Open();
複製代碼

比原來多了4行添加服務行爲的代碼。

現在,運行兩個宿主程序中的任意一個,點擊啓動按鈕後,服務就啓動併發布了,客戶端可以發現契約並使用。

客戶端:

客戶端如何發現並使用服務,有2種方式:使用命令行svcutil生成文件、在IDE中添加服務引用。

1、使用svcutil

運行宿主並啓動服務;運行Visual Studio 命令提示,鍵入svcutil http://localhost:5678/DemoService/metadata,將生成一個DemoService.cs文件和一個output.config文件(可以通過/out:指定輸出目錄);

在解決方案中添加一個Windows窗體應用程序WCFDemo.Client,爲其添加引用System.ServiceModelSystem.Runtime.Serialization

將剛纔生成的兩個文件添加到項目,並將output.config改名爲App.config

在窗體上放置一個ButtonDataGridView,爲ButtonClick編寫代碼如下:

DemoServiceClient c = new DemoServiceClient();
dataGridView1.DataSource = c.GetMonitorData();

當然可以不用配置文件,new DemoServiceClient()中設置參數binding和remoteAddress。

svcutil常用的選項有/out:、/config:、/noconfig:等,詳細用法這裏就不介紹了。查看配置文件會發現裏面內容很多,因爲它自動爲關鍵的綁定節點設置了默認值,這部分內容可以刪除,所以很多時候不使用svcutil生成的配置文件。

2、添加服務引用

右擊WCFDemo.Client,在添加服務引用對話框中輸入地址http://localhost:5678/DemoService/metadata,點擊“前往”按鈕:

給命名空間起個好名(示例中就用默認名)後確定。

我們會發現,除了添加了服務引用,還修改了配置文件,如果原來沒有配置文件,添加服務引用後會自動添加配置文件。

在窗體上再放置一個Button,爲其Click編寫代碼如下:

ServiceReference1.DemoServiceClient c = new ServiceReference1.DemoServiceClient();
dataGridView1.DataSource = c.GetMonitorData();

和前一個一樣,可以不用配置文件。

服務器有兩種方案發布自己的元數據:基於HTTP-GET協議、使用專門的終結點。以上介紹的是前一種,下面介紹一下第二種。

1、使用配置文件

將之前的WCFDemo.Host.WithConfig項目的配置文件用WCF服務配置編輯器打開,新建服務終結點,並設置ABC:

現在WCFDemo.Host.WithConfig已提供兩種發佈服務的方式,啓動服務後,客戶端通過之前的地址http://localhost:5678/DemoService/metadata和剛纔輸入的地址http://localhost:5678/DemoService/MEX,都可以找到服務。

2、使用代碼方式

在WCFDemo.Host.WithoutConfig項目的啓動服務代碼處增加一行添加終結點代碼:

複製代碼
            host = new ServiceHost(typeof(DemoService));
          host.AddServiceEndpoint(typeof(IDemoService), new BasicHttpBinding(), "http://localhost:5678/DemoService");            

          ServiceMetadataBehavior b = new ServiceMetadataBehavior();
          b.HttpGetEnabled = true;
          b.HttpGetUrl = new Uri("http://localhost:5678/DemoService/metadata");
          host.Description.Behaviors.Add(b);

          host.AddServiceEndpoint(typeof(IMetadataExchange), new CustomBinding(new HttpTransportBindingElement()), "http://localhost:5678/DemoService/MEX");                     

          host.Opened += delegate { label1.Text = "服務啓動"; };
          host.Open();
複製代碼

效果同上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章