2010-03-29 80 views
0

我開始在Silverlight中開發一個應用程序,用於下載網站的HTML並解析它。藉助Silverlight 4,只需請求提升的權限即可輕鬆實現。但是,使用Silverlight 3時,獲取網站HTML的唯一方法是通過WebService調用。我最初的想法是做到以下幾點:在WebService中調用WebClient

public class Service1 
{ 
    [OperationContract] 
    public void GetHtml() 
    { 
     Uri targetUri = new Uri("http://www.google.com", UriKind.RelativeOrAbsolute); 

     WebClient webClient = new WebClient(); 
     webClient.DownloadStringCompleted += this.WebClient_DownloadStringCompleted; 
     webClient.DownloadStringAsync(targetUri); 
    } 

    private void WebClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 

    } 
} 

但是,我意識到,只要我打這個電話,這是異步還有,從我的Silverlight應用程序,也沒有辦法,我檢索HTML的網站。這就是爲什麼我更改爲以下:

public class Service1 
{ 
    [OperationContract] 
    public string GetHtml() 
    { 
     Uri targetUri = new Uri("http://www.google.com", UriKind.RelativeOrAbsolute); 

     WebClient webClient = new WebClient(); 
     return webClient.DownloadString(targetUri); 
    } 
} 

我相信最後一種方法是不是罰款,因爲它會凍結線程。所以,我的問題,有沒有辦法實現第一種方法也叫異步調用異步調用:)。任何幫助將不勝感激。

最好的問候, 基里爾·

+0

我不確定我是否理解這個問題。代碼的第二個版本只會凍結服務器上的線程。當SL - >服務呼叫正在進行時,您的客戶端應用程序將保持「解凍」狀態。 – 2010-03-29 07:49:00

+0

這就是我想要避免的 - 凍結服務器。如果我使用DownloadStringAsync進行WebClient調用,服務器將不會被凍結,但是如何獲取在DownloadStringCompleted事件處理程序中返回的數據? – 2010-03-29 08:05:09

+0

啊,對不起。我誤解了你的問題。 – 2010-03-29 09:22:33

回答

1

您可以通過implementig雙工服務實現自己的目標。 Mike Taulty在msdn sitepodcast entry上有一些有用的信息。一般來說,您必須將其分爲兩部分來修改您的運營合同。第一部分將在服務器上啓動WebClient下載。然後,在服務器上,在下載了html之後,服務器將回調在客戶端實施的合同,其中有效載荷由所需的html內容組成。

+1

+1爲一個很好的答案。但是:雖然這個解決方案絕對是必須的,但我仍然想知道爲什麼你需要它。任何體面的Web服務器都能完美地處理多個請求。它不會因爲它正在下載一些HTML而被「凍結」。 – 2010-03-29 09:26:45

+1

@Henrik。我同意你的100%。這只是'如果你絕對必須'。感謝+1 :) – Przemek 2010-03-29 09:38:16

+0

所以你們都說在這種情況下使用DownloadString方法是完全正常的。 – 2010-03-29 11:23:27