2013-01-16 69 views
4

我有這個方法的WCF服務。該方法具有WebInvoke Attribute。我怎樣才能異步調用它?如何使用WebInvokeAttribute異步調用WCF服務方法?

[WebInvoke(UriTemplate = "*", Method = "*")] 
public Message HandleRequest() 
{ 
    var webContext = WebOperationContext.Current; 
    var webClient = new WebClient(); 

    return webContext.CreateStreamResponse(webClient.OpenRead("http://site.com"), "text/html"); 
} 
+0

該方法通常是用來通過REST服務。 WebInvoke通過Http「POST」方法調用,而WebGet是Http「GET」。你是指REST服務? –

+0

是的,REST服務。我通過瀏覽器使用這項服務。 –

回答

0

您可以定義異步行爲,以服務類,通過將以下值一起ServiceBehavior屬性:

  1. InstanceContextMode = InstanceContextMode.Single
  2. ConcurrencyMode = ConcurrencyMode.Multiple

產生的代碼可能類似於以下:

[ServiceContract] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class MyService 
{ 
    [WebInvoke(UriTemplate = "*", Method = "*")] 
    public Message HandleRequest() 
    { 
     var webContext = WebOperationContext.Current; 
     var webClient = new WebClient(); 

     return webContext.CreateStreamResponse(webClient.OpenRead("http://site.com"), "text/html"); 
    } 
} 
1

當您調用該方法時,您可以在客戶端使用線程。 但是爲了更準確的響應,請定義客戶端:使用哪種技術等。

+0

但我的客戶端是瀏覽器。 –

+0

您無法通過瀏覽器進行異步通話。你爲什麼想這樣做? –

+2

不可能是無關緊要的 –

0

您可以使用任務並行庫或TPL異步調用它。這是一個例子。示例代碼正在調用WebGet。 WebInvoke或HTTP Post代碼有一些不同之處。請注意,TPL僅適用於.NET Framework 3.5及更高版本

使用System.Threading.Tasks添加;您usings

//URL that points to your REST service method 
       var request = WebRequest.Create(url);     
       var task = Task.Factory.FromAsync<WebResponse>(
          request.BeginGetResponse, 
          request.EndGetResponse, 
          null); 
       var dataStream = task.Result.GetResponseStream(); 
       var reader = new StreamReader(dataStream); 
       var responseFromServer = reader.ReadToEnd(); 
       reader.Close(); 
       dataStream.Close();