2011-06-09 82 views
1

我需要調用Web服務上的操作,但我不知道請求信封的外觀(服務在用戶運行時附加)。如何從C#中的wsdl SOAP請求信封中去除

通常我想生成基於wsdl鏈接編程的soap信封。隨着給定的鏈接獲取操作列表和這樣的結果爲特定的一個:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:webservice.contentinn.com"> 
    <soapenv:Header> 
     <urn:AuthHeaderElement> 
      <token></company> 
     </urn:AuthHeaderElement> 
    </soapenv:Header> 
    <soapenv:Body> 
     <urn:TestMethod> 
     <id></id> 
     </urn:TestMethod> 
    </soapenv:Body> 
</soapenv:Envelope> 

任何人都知道如何做到這一點?

+0

RE:服務在運行時被用戶添加......你希望自動調用函數嗎?例如這是某種類型的測試設備/接口嗎?假設服務1接受經緯度並返回天氣信息。現在有人添加一個Service2,它也接受Lat/Lon。你想繼續並調用它嗎? (事實證明,Service2會在該位置轉儲一桶油漆。)我的觀點是,除了測試場景之外,您可能不想自動調用某項新服務。如果是這種情況,您可能不需要動態生成代理。 – 2011-06-09 14:39:54

回答

1

Answers to this question提出了幾個辦法:

  • SoapUI:這是不是一個真正的編程方法。
  • Castle Dynamic Proxy:這更接近你聽起來像你需要的東西,但還不夠。
  • The example here可能是你追求的:

    的DynamicProxy允許您通過指定服務的WSDL URI在運行時創建的動態WCF客戶端。 DynamicProxy不依賴於預編譯的代理或配置。 DynamicProxy使用MetadataResolver從服務和WsdlImporter下載元數據以在運行時創建合約和綁定。已編譯的動態代理可用於使用反射調用服務上的操作。

    該示例顯示了動態代理如何調用使用簡單類型和複雜類型的操作。使用流程如下。

    1. 創建指定服務的WSDL URI的ProxyFactory。

      DynamicProxyFactory factory = new DynamicProxyFactory(「http://localhost:8080/WcfSamples/DynamicProxy?wsdl」);

    2. 瀏覽端點,元數據,合同等

    factory.Endpoints factory.Metadata factory.Contracts factory.Bindings 
    
  • 通過指定端點或合同名創建DynamicProxy到端點。
  • DynamicProxy proxy = factory.CreateProxy("ISimpleCalculator"); 
    

    OR

    DynamicProxy proxy = factory.CreateProxy(endpoint); 
    
  • 調用上DynamicProxy
  • 操作
    double result = (dobule)proxy.CallMethod("Add", 1d ,2d); 
    
  • 關閉DynamicProxy
  • proxy.Close(); 
    

    要運行示例:編譯該解決方案中,運行CalculatorService.exe然後運行CalculatorDynamicClient.exe

  • There is a Java example here,太。

+0

非常感謝!這非常有幫助。 – eye 2011-06-09 14:02:08

+0

不客氣!我也對答案感興趣。 :-) – 2011-06-09 15:14:37

0

您需要生成一個代理類;這將生成調用服務操作所需的所有內容。

有幾種方法來生成代理類

  1. 你可以添加一個服務引用到項目
  2. 運行SvcUtil工具:一旦生成代理類SvcUtil工具http://someurl?wsdl

,它將把服務的行爲暴露爲方法。只需調用所需的方法,即可爲您生成SOAP信封。