Как вызвать метод службы WCF асинхронно с WebInvokeAttribute?

У меня есть служба 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");
}

3 ответа

Решение

Вы можете определить асинхронное поведение для вашего класса обслуживания, передав следующие значения вместе 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");
    }
}

Вы можете использовать Thread в своем клиенте, когда вызываете этот метод. Но для более точного ответа определите клиента: какая технология используется и т. Д.

Вы можете вызвать его асинхронно, используя Task Parallel Library или 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();
Другие вопросы по тегам