2011-02-11 32 views
2

如何設置後退端點。我在conifg文件中指定了多個端點,如下所示。如果服務無法訪問,那麼我的客戶應該檢查列表中指定的下一個地址。如何在WCF中設置多個後備端點

客戶端配置文件:

<client> 
    <endpoint address="http://192.168.1.4/SampleAppWeb/Services/SampleAppService.svc" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISampleAppService" 
     contract="SampleAppServiceReference.ISampleAppService" name="BasicHttpBinding_ISampleAppService" /> 
    <endpoint address="http://172.168.12.121/SampleAppWeb/Services/SampleAppService.svc" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISampleAppService" 
     contract="SampleAppServiceReference.ISampleAppService" name="BasicHttpBinding_ISampleAppService1" /> 
    <endpoint address="http://127.0.0.1/Services/SampleAppWeb/SampleAppService.svc" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISampleAppService" 
     contract="SampleAppServiceReference.ISampleAppService" name="BasicHttpBinding_ISampleAppService2" /> 
    <endpoint address="http://172.168.111.115/Services/SampleAppWeb/SampleAppService.svc" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISampleAppService" 
     contract="SampleAppServiceReference.ISampleAppService" name="BasicHttpBinding_ISampleAppService3" />   
</client> 

代碼背後:

var pass = new SampleAppServiceReference.SampleAppServiceClient("BasicHttpBinding_ISampleAppService3"); 
+1

那麼,你的問題是什麼? – 2011-02-14 05:02:44

回答

3

WCF本身不具有任何內置功能這一點,但你可以很容易地創建一個類這將爲您做重試。下面的例子顯示了一種這樣的方式。請注意,如果綁定使用會話,則可能需要重新創建客戶端(而不是簡單地重用它),因爲如果發生錯誤,其通道可能會出錯。

public class StackOverflow_4968244 
{ 
    [ServiceContract] 
    public interface ITest 
    { 
     [OperationContract] 
     int Add(int x, int y); 
    } 
    public class Service : ITest 
    { 
     public int Add(int x, int y) 
     { 
      Console.WriteLine("Request at service: {0}", OperationContext.Current.Host.BaseAddresses[0]); 
      if (new Random().Next(3) == 0) 
      { 
       throw new InvalidOperationException("Random error"); 
      } 

      return x + y; 
     } 
    } 
    public class Client : ClientBase<ITest>, ITest 
    { 
     public Client(string address) : base(new BasicHttpBinding(), new EndpointAddress(address)) { } 

     public int Add(int x, int y) 
     { 
      return this.Channel.Add(x, y); 
     } 
    } 
    public class SafeClient : ITest 
    { 
     List<Client> clients; 
     public SafeClient(params Client[] clients) 
     { 
      this.clients = new List<Client>(clients); 
     } 

     public int Add(int x, int y) 
     { 
      foreach (var client in this.clients) 
      { 
       try 
       { 
        return client.Add(x, y); 
       } 
       catch (CommunicationException) 
       { 
        Console.WriteLine("Error calling client {0}, retrying with next one", client.Endpoint.Address.Uri); 
       } 
      } 

      throw new InvalidOperationException("All services seem to be down"); 
     } 
    } 

    public static void Test() 
    { 
     string baseAddress1 = "http://" + Environment.MachineName + ":8000/Service"; 
     string baseAddress2 = "http://" + Environment.MachineName + ":8001/Service"; 
     string baseAddress3 = "http://" + Environment.MachineName + ":8002/Service"; 
     ServiceHost host1 = new ServiceHost(typeof(Service), new Uri(baseAddress1)); 
     ServiceHost host2 = new ServiceHost(typeof(Service), new Uri(baseAddress2)); 
     ServiceHost host3 = new ServiceHost(typeof(Service), new Uri(baseAddress3)); 
     host1.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), ""); 
     host2.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), ""); 
     host3.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), ""); 
     host1.Open(); 
     host2.Open(); 
     host3.Open(); 
     Console.WriteLine("Hosts opened"); 

     SafeClient safeClient = new SafeClient(
      new Client(baseAddress1), 
      new Client(baseAddress2), 
      new Client(baseAddress3)); 
     for (int i = 0; i < 20; i++) 
     { 
      Console.WriteLine(safeClient.Add(i, 10)); 
     } 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host1.Close(); 
     host2.Close(); 
     host3.Close(); 
    } 
}