- File->New Website->WCF Service->MyWCFService
- MyWCFService, 設port使用8080
- File->Add->new Project->加入Console Application做為Routing Service Host,名為RsHost
- RsHost,加入參考System.ServiceModel, System.ServiceModel.Routing.dll
- RsHost,加入app.config檔,並加入以下內容
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="System.ServiceModel.Routing.RoutingService"
behaviorConfiguration="routingData">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8081/routing/"/>
</baseAddresses>
</host>
<endpoint address="requestReply"
binding="basicHttpBinding"
contract="System.ServiceModel.Routing.IRequestReplyRouter"/>
</service>
</services>
<client>
<endpoint name="epMyWCFService"
address="http://localhost:8080/MyWCFService/Service.svc"
binding="basicHttpBinding"
contract="*"/>
</client>
<behaviors>
<serviceBehaviors>
<behavior name="routingData">
<routing filterTableName="routingTable" />
</behavior>
</serviceBehaviors>
</behaviors>
<routing>
<filters>
<filter name="MatchAllDefaultFilter" filterType="MatchAll" />
</filters>
<filterTables>
<filterTable name="routingTable">
<add filterName="MatchAllDefaultFilter"
endpointName="epMyWCFService"/>
</filterTable>
</filterTables>
</routing>
</system.serviceModel>
</configuration>
<configuration>
<system.serviceModel>
<services>
<service name="System.ServiceModel.Routing.RoutingService"
behaviorConfiguration="routingData">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8081/routing/"/>
</baseAddresses>
</host>
<endpoint address="requestReply"
binding="basicHttpBinding"
contract="System.ServiceModel.Routing.IRequestReplyRouter"/>
</service>
</services>
<client>
<endpoint name="epMyWCFService"
address="http://localhost:8080/MyWCFService/Service.svc"
binding="basicHttpBinding"
contract="*"/>
</client>
<behaviors>
<serviceBehaviors>
<behavior name="routingData">
<routing filterTableName="routingTable" />
</behavior>
</serviceBehaviors>
</behaviors>
<routing>
<filters>
<filter name="MatchAllDefaultFilter" filterType="MatchAll" />
</filters>
<filterTables>
<filterTable name="routingTable">
<add filterName="MatchAllDefaultFilter"
endpointName="epMyWCFService"/>
</filterTable>
</filterTables>
</routing>
</system.serviceModel>
</configuration>
- RsHost,Main方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Routing;
namespace RsHost
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("RS is running...");
ServiceHost myServiceHost = new ServiceHost(typeof(RoutingService));
myServiceHost.Open();
Console.Read();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Routing;
namespace RsHost
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("RS is running...");
ServiceHost myServiceHost = new ServiceHost(typeof(RoutingService));
myServiceHost.Open();
Console.Read();
}
}
}
- 測試執行RsHost專案可以執行,不會出現錯誤
- File->Add->new Project->加入Console Application做為Client,名為ConClient
- ConClient,Add Service Reference->Discover->OK
- ConClient,Main Method
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConClient
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
ServiceReference1.ServiceClient c = new ServiceReference1.ServiceClient();
Console.WriteLine(c.GetData(10));
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConClient
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
ServiceReference1.ServiceClient c = new ServiceReference1.ServiceClient();
Console.WriteLine(c.GetData(10));
}
}
}
- ConClient,app.config,修改address=http://localhost:8081/routing/requestReply,以下是ConClient組態檔client 區段
<client>
<endpoint address="http://localhost:8081/routing/requestReply"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
contract="ServiceReference1.IService" name="BasicHttpBinding_IService" />
</client>
<endpoint address="http://localhost:8081/routing/requestReply"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
contract="ServiceReference1.IService" name="BasicHttpBinding_IService" />
</client>
- 設定同時執行三個專案,請注意專案順序,愈上面愈先執行
- Run,ConClient可以取得服務回傳的結果
若服務掛點,在WCF4中我們可以設定備援清單,將請求繞送到其它服務執行。例如以下步驟,修改服務接聽9999 port ,但實際上這個服務並不存在,ConClient透過Routing Service叫用9999埠的服務,利用備援清單,導向接聽8080的服務。
- RsHost,修改RSHost app.config檔,<client>下,加入 endpoint,聽port 9999,<Clinet>區段看起來如
<client>
<endpoint name="epMyWCFService"
address="http://localhost:8080/MyWCFService/Service.svc"
binding="basicHttpBinding"
contract="*"/>
<endpoint name="Dead"
address="http://localhost:9999/MyWCFService/Service.svc"
binding="basicHttpBinding"
contract="*"/>
</client>
<endpoint name="epMyWCFService"
address="http://localhost:8080/MyWCFService/Service.svc"
binding="basicHttpBinding"
contract="*"/>
<endpoint name="Dead"
address="http://localhost:9999/MyWCFService/Service.svc"
binding="basicHttpBinding"
contract="*"/>
</client>
- RsHost,在app.config,<routing>下,加
<backupLists>
<backupList name="bklist">
<add endpointName="epMyWCFService"/>
</backupList>
</backupLists>
<backupList name="bklist">
<add endpointName="epMyWCFService"/>
</backupList>
</backupLists>
- RsHost,在app.config,修改filter,endpointName="Dead" backupList="bklist"
<filterTables>
<filterTable name="routingTable">
<add filterName="MatchAllDefaultFilter"
endpointName="Dead" backupList="bklist" /> </filterTable>
</filterTables>
<filterTable name="routingTable">
<add filterName="MatchAllDefaultFilter"
endpointName="Dead" backupList="bklist" /> </filterTable>
</filterTables>
- Run,ConClient可以取得服務回傳的結果
沒有留言:
張貼留言