2008-12-11 61 views
2

我有一個場景,我將需要任意數量的服務器來提供相同的SOAP Web服務。我想生成一組代理類,並能夠向它們提供一個位置,以便在運行時將它們指向不同的服務器。不幸的是,它好像wsdl:port節點(wsdl:service的子節點)要求硬編碼特定服務器的地址。看來,由於這個URL將被烘焙到我的代理類。我知道我可以通過手動編輯生成的代理類或修改代碼生成來修改此操作,但我真的不想訴諸於此。我覺得有必要有更好的方法來解決這個問題。我只是想將接口定義與服務將駐留的位置分開。我使用VS2008和C#.NET,如果有任何幫助的話,儘管最好的解決方案是針對此問題的語言不可知(SOAP或WSDL特定)通用解決方案。SOAP Web服務:許多服務器,一個接口

回答

0

向項目中添加Web引用時,會將Web服務的地址放入應用程序/ Web應用程序的.config文件中。然後,您可以簡單地在配置文件中更改此設置,以指向不同的Web服務位置,假設服務是相同的。

+1

我不認爲這會對我有用,因爲我需要在運行時切換與我交談的服務器。配置文件似乎會限制我編譯(或至少配置)時間。 – sgibbons 2008-12-11 21:03:21

2

不,在.NET中,您可以在運行時更改URL。

Service svc = new Service(); 
svc.url = "Value read from config. file or some such" 
output = svc.method (input); 
2

如果您使用的是Web引用(預WCF)來獲取到Web服務,您可以簡單地設置您創建後,Web服務代理類的Url屬性。

對於WCF,您可以爲代理類構造函數提供不同的端點地址,而不是使用默認值(以及其他可能的解決方案)。

2

爲什麼你不負載平衡Web服務器,然後爲負載平衡的IP地址創建一個DNS條目....本質上創建一個網絡農場。這將允許您引用主機名而不是靜態IP地址,並且如果您需要更改負載均衡器或Web服務器的IP地址,則這是一次性更改。此外,您還擁有冗餘和性能控制。

+0

正是我要說的。使用反向代理。 +1 – ConcernedOfTunbridgeWells 2009-01-13 21:01:08

0

客戶端代理具有您可以在運行時設置的URL屬性。爲了使它更簡單,wsdl.exe實用程序有/appsettingurlkey密鑰。當您生成客戶端代理時,它的構造函數將檢查appSettings中的鍵並相應地設置服務URL。我相信WCF也有這個功能。

但是,我會同意@Matt,並建議您考慮負載平衡作爲長期的最佳解決方案。

0
  1. 這是用於縮放(每個服務器提供相同的數據),用於在每個服務器上相同的API不同的數據或

對於2,那麼你可以像上面那樣做,只需更改代碼中的服務URL即可。

對於1,您可以使用循環法DNS(例如,您可以在命令行類型nslookup www.google.com處看到多個服務器)。

0

最簡單的解決方案是使用軟件負載平衡器,例如HAProxy。以更高的成本,您可以使用硬件解決方案,如Big-IP

0

以下是關於如何決定WSDL URL的提示。我只是在改變港口,但當然可以讓它更先進。

public class PortChangeReflector : SoapExtensionReflector 
{  
    public override void ReflectDescription() 
    { 
     ServiceDescription description = ReflectionContext.ServiceDescription; 
     foreach (Service service in description.Services) 
     { 
      foreach (Port port in service.Ports) 
      { 
       foreach (ServiceDescriptionFormatExtension extension in port.Extensions) 
       { 
        SoapAddressBinding binding = extension as SoapAddressBinding; 
        if (binding != null && !binding.Location.Contains("8092")) 
        { 
         binding.Location = binding.Location.Replace("92", "8092"); 
        } 
       } 
      } 
     } 
    } 
} 

假如把它放在你的Add_Code並添加以下內容,您的web.config

<webServices> 
    <soapExtensionReflectorTypes> 
      <add type="Dev.PortChangeReflector,App_Code"/> 
    </soapExtensionReflectorTypes> 
</webServices> 

我希望你能得到這個新的想法。