C# 如何使用WebInvokeAttribute异步调用WCF服务方法?

C# 如何使用WebInvokeAttribute异步调用WCF服务方法?,c#,wcf,asynchronous,webinvoke,C#,Wcf,Asynchronous,Webinvoke,我有WCF服务与这一方法。该方法具有WebInvoke属性。如何异步调用它 [WebInvoke(UriTemplate=“*”,Method=“*”)] 公共消息HandleRequest() { var webContext=WebOperationContext.Current; var webClient=新的webClient(); 返回webContext.CreateStreamResponse(webClient.OpenRead(“http://site.com”),“文本/h

我有WCF服务与这一方法。该方法具有WebInvoke属性。如何异步调用它

[WebInvoke(UriTemplate=“*”,Method=“*”)]
公共消息HandleRequest()
{
var webContext=WebOperationContext.Current;
var webClient=新的webClient();
返回webContext.CreateStreamResponse(webClient.OpenRead(“http://site.com”),“文本/html”);
}

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

您可以使用任务并行库或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();
//指向REST服务方法的URL
var request=WebRequest.Create(url);
var task=task.Factory.fromsync(
request.BeginGetResponse,
request.EndGetResponse,
无效);
var dataStream=task.Result.GetResponseStream();
变量读取器=新的StreamReader(数据流);
var responseFromServer=reader.ReadToEnd();
reader.Close();
dataStream.Close();

您可以通过将以下值一起传递到
服务行为
属性,为服务类定义异步行为:

  • InstanceContextMode=InstanceContextMode.Single
  • 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");
        }
    }
    

    REST服务通常使用这种方法。WebInvoke是通过Http“POST”方法调用的,而WebGet是Http“GET”。你指的是休息服务吗?是的,休息服务。我通过浏览器使用此服务。您不能使用浏览器进行异步调用。你为什么要这么做?