4

我有这种方法的 WCF 服务。该方法具有 WebInvoke 属性。我怎样才能异步调用它?

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

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

3 回答 3

1

调用该方法时,您可以在客户端中使用线程。但是为了更精确的响应,请定义客户端:使用哪种技术等。

于 2013-01-17T13:58:22.047 回答
0

您可以使用任务并行库或 TPL 异步调用它。这是一个例子。示例代码正在调用 WebGet。WebInvoke 或 HTTP Post 代码有一些不同。请注意,TPL 仅适用于 .NET Framework 3.5 及更高版本

使用 System.Threading.Tasks 添加;到你的用途

  //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();
于 2013-01-18T00:04:26.743 回答
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");
    }
}
于 2013-01-30T15:01:33.960 回答