2012-06-19 82 views
9

我有一個wsdl文件,它的構建方式非常無益。這是巨大的,在某些情況下是幾兆字節大小,並且當我使用各種Visual Studio工具從中生成包裝時,生成的代碼庫非常大,以至於它會在較弱的機器上使Visual Studio崩潰。編譯時間是可笑的,並且最終的類使用屬性,其中更加動態的訪問模式是絕對必要的(即某種索引器)。在服務器端沒有任何更改的選項。使用不同的接口來使用Web服務

wsdl文件比手動處理的要大得多,並且有任意數量的文件。到目前爲止,我所使用的解決方案是使用反射或後期綁定的結果,自動生成的類。然而,因爲我在這裏處理包裝包裝什麼是SOAP消息的客戶端,如果有另一種方式,它將是有意義的。

本質上,我想創建一個暴露更多動態接口的包裝,尤其是涉及到字段的地方。這個任務並不是完全簡單,所以我正在尋找關於如何去做的建議,以及各種類,可定製的代碼生成器,WSDL瀏覽器/解析器等,這將減少任務的時間。我應該構建自己的SOAP客戶端嗎?我會基於什麼? .NET功能可以幫助我完成此任務?

+2

請問是什麼讓wsdl如此之大? – Paparazzi

+0

它有噸和噸的領域/屬性。 – GregRos

回答

9

您可以手工製作一個接口,該接口支持WebService上可用方法的一個子集,並取消生成服務引用的需要。

您將不得不爲包括dto和名稱空間的方法創建正確的soap簽名。其缺點是您將被迫手動管理對服務的任何更改。

下面是一個簡單的示例,顯示了通過ISubsetInterface通信與暴露IServiceInterface的服務創建的代理客戶端。爲了達到這個目的,Name屬性必須匹配IServiceInterface協議的名稱,在這種情況下默認爲「IServiceInterface」,但是你的實現可能需要操作名稱空間和動作。知道您需要操作的最簡單方法是查看生成的wsdl。

[TestFixture] 
public class When_using_a_subset_of_a_WCF_interface 
{ 
    [Test] 
    public void Should_call_interesting_method() 
    { 
     var serviceHost = new ServiceHost(typeof(Service)); 

     serviceHost.AddServiceEndpoint(typeof(IServiceInterface), new BasicHttpBinding(), "http://localhost:8081/Service"); 
     serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true; 

     serviceHost.Open(); 

     using(var channelFactory = new ChannelFactory<ISubsetInterface>(new BasicHttpBinding(), "http://localhost:8081/Service")) 
     { 
      var client = channelFactory.CreateChannel(); 

      client.InterestingMethod().Should().Be("foo"); 
     } 

     serviceHost.Close(); 
    } 

    [ServiceContract] 
    interface IServiceInterface 
    { 
     [OperationContract] 
     string InterestingMethod(); 
     [OperationContract] 
     string UninterestingMethod(); 
    } 

    [ServiceContract(Name = "IServiceInterface")] 
    interface ISubsetInterface 
    { 
     [OperationContract] 
     string InterestingMethod(); 
    } 

    class Service : IServiceInterface 
    { 
     public string InterestingMethod() { return "foo"; } 

     public string UninterestingMethod() { throw new NotImplementedException(); } 
    } 
} 
2

我建議使用包含DataContracts的共享程序集。

然後使用ChannelFactory<T>類創建服務器接口的實例。然後你可以在沒有任何WSDL的情況下調用服務器。