асинхронный вызов службы WCF 4.5 WCF

Я хочу убедиться, что у меня есть правильный код для асинхронного вызова моей веб-службы. Если кто-то может помочь, я был бы очень признателен.

Я использую Visual Studio 2013 с платформой 4.5.1.

У меня есть следующий код в моем клиентском приложении, выполняющем вызов службы:

public async Task<ActionResult> Read([DataSourceRequest]DataSourceRequest request)
        {    
            try
            {
                YeagerTechWcfService.Status[] status = await db.GetStatusesAsync();

                var serializer = new JavaScriptSerializer();
                var result = new ContentResult();
                serializer.MaxJsonLength = Int32.MaxValue;
                result.Content = serializer.Serialize(status.ToDataSourceResult(request));
                result.ContentType = "application/json";

                return result;
            }

В моем сервисном контракте WCF для вышеуказанного вызова метода есть следующее:

[ServiceContract]
    public interface IYeagerTechWcfService
    {
            [OperationContract]
        Task<List<Status>> GetStatusesAsync();

У меня есть следующее в моем классе веб-сервиса, который реализует класс интерфейса для того же метода:

public class YeagerTechWcfService : IYeagerTechWcfService
    {
            public async Task<List<Status>> GetStatusesAsync()
        {
            try
            {
                using (YeagerTechEntities DbContext = new YeagerTechEntities())
                {
                    DbContext.Configuration.ProxyCreationEnabled = false;
                    DbContext.Database.Connection.Open();

                    var status = await DbContext.Status.ToListAsync();

                    return status;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

Согласно тому, что я читал дальше, мне также нужно было бы поместить следующее после моего атрибута OperationContract: *Это правда?*

[OperationContractAttribute(AsyncPattern = true)]
    IAsyncResult BeginGetStatusesAsync(AsyncCallback callback, object asyncState);

    string EndGetStatusesAsync(IAsyncResult result);

person sagesky36    schedule 21.11.2013    source источник
comment
Я не всегда вызываю службы WCF пьяными, но когда я это делаю, я вызываю их асинхронно.   -  person    schedule 21.11.2013


Ответы (2)


Нет, AsyncPattern больше не требуется, начиная с .NET 4.5.

У меня есть сообщение в блоге Async WCF Today and Tomorrow, в котором сравниваются старые способ асинхронного WCF («Сегодня» в сообщении блога: .NET 4.0) с новым способом асинхронного WCF («Завтра» в сообщении блога: .NET 4.5).

person Stephen Cleary    schedule 21.11.2013

Ваша служба WCF не обязана поддерживать асинхронные методы; генерация клиента (Добавить ссылку на службу) может создать для вас асинхронную обработку вызовов на стороне клиента.

При добавлении ссылки на службу в клиентское приложение просто установите флажок «Создать асинхронные операции», и ваш прокси-класс будет содержать асинхронные версии вызовов. Легко!

person Roy Dictus    schedule 21.11.2013