2012-06-11 78 views
1

過去,我有過調用WCF服務或ASMX服務的經驗,您只需將服務引用添加到.svc或.asmx url中,並生成代理你,然後你有調用方法的智能感知。如何調用.NET中未開發的web服務

對於非.net webservice它是一樣的嗎?

我需要調用此 http://www.earthtools.org/webservices.htm

從C在WinRT的應用程序#代碼

,但我只是不知道如何

+0

你嘗試過什麼嗎?像引用/添加Web服務項目並指向此網址? SOAP是不同平臺的標準。 – Kangkan

回答

7

如果您有WSDL,那麼您可以添加對該服務的引用。但在此嘗試調用REST服務。

你需要發送POST請求和RAD的響應爲:從here

private const string BASE_URL = "http://www.earthtools.org/timezone"; 
private const string REQUEST_URL_FORMAT = "{0}/{1}/{2}"; 

public timezone GetTimeZone(double latitude, double longitude) 
{ 
    var uriString = String.Format(REQUEST_URL_FORMAT, BASE_URL, latitude, longitude); 
    var requestUri = new Uri(uriString); 

    var request = WebRequest.Create(requestUri); 
    using (var response = request.GetResponse()) 
    { 
     using (var responseStream = response.GetResponseStream()) 
     { 
      var ser = new XmlSerializer(typeof (timezone)); 
      var result = (timezone) ser.Deserialize(responseStream); 
      return result; 
     } 
    } 
} 

例子。

+0

+1閱讀頁面,意識到它不是SOAP –

2

如果他們SOAP的Web服務,那麼你可以仍然指向Visual Studio中的。 WSDL端點並讓它生成客戶端代理。但這些似乎是REST服務。我認爲你最好的選擇是使用XDocument.Load或其他,然後使用Linq-to-XML或XML反序列化將XML轉換爲C#類。例如,假設您想致電this service。獲得緯度/經度結果的簡單方法是這樣的:

XDocument xdoc = XDocument.Load("http://www.earthtools.org/height/52.4822/-1.8946"); 
var lat = (decimal)xdoc.Element("location").Element("latitude"); 
var lng = (decimal)xdoc.Element("location").Element("longitude"); 
1

微軟營銷人員會說,即使是異構系統,Web服務也是可以互操作的。

這是事實的一半。 Web服務標準實際上是多平臺的。然而在現場,它可能會更復雜一點。不同系統的不同哲學可能導致不同的行爲。

不久前,我添加到查詢使用Java Web邏輯構建的Web服務(不知道系統的,我是在客戶端)與Visual Studio 2010這是一個有點痛苦的,因爲:

  1. Visual Studio代理嚮導只能理解內聯模式。這裏的模式是使用<xsd:import>的wsdl中的引用。 Visual Studio不明白
  2. 然後我轉移到svcutil從命令行生成代理。由於WSDL文件中存在一些錯誤(這個文件是由服務提供者手動構建的),這不是直接工作的。我必須要求服務提供商清除它的wsdl文件
  3. 表示DTO的xsd文件由多個Web服務共享。這導致在每個代理中複製相同的類,即使沒有被所有服務使用。我不得不調整部分類來「重新包裝」成獨特的類。

總而言之,您可以使用術語「互操作性」的限制。標準表示它可以互操作,但該領域並不總是如此。

我歡迎新的「休息」服務世界。這可以簡化很多互操作性。缺點是你可能不得不建立自己的管道的一部分。

好消息,你提到的服務似乎擁抱這個休息哲學。這不是直接的,但你可以建立簡單的Http請求(post,get或put)來查詢這個服務。