2015-01-11 4 views
3

У меня есть существующая служба WCF с конечной точкой SOAP с использованием .NET 4.5. В большинстве существующих клиентских кодов используется прокси-подход ChannelFactory<T>.Как добавить поддержку async в службу .NET 4.5 WCF, чтобы она не нарушала существующих клиентов?

Я хочу изменить сервис для поддержки модели async/await для различных операций ввода-вывода на стороне сервера и базы данных.

Проблема, с которой я столкнулась, заключается в том, что добавление ключевого слова async в вызовы метода WCF требует изменения их сигнатур интерфейса до Task<T>. Это, в свою очередь, требует изменения кода клиента.

Сохраняя код обслуживания async «полностью вниз», существует ли простой способ сохранить открытый API без изменений?

+0

Вы используете общую модель справа? Вы не добавили ссылку на сервис? – i3arnon

+0

^Для проектов в решении, да. Существуют также внешние, не-NET клиенты. – RickNZ

ответ

6

До тех пор, пока вы переименуете свой метод на стороне сервера, чтобы включить слово XxxxxAsync, он не изменит подпись клиента.

WCF автоматически делает две конечные точки для каждого метода, синхронной версии и асинхронной версии. Вы можете увидеть это с помощью тестового клиента WCF.

Например, контракт на следующий сервис

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    string GetData(int value); 
} 

public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 
} 

Когда вы запустите тестовый клиент WCF, вы увидите 2 доступные методы

enter image description here

Если изменить код на следующее

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    Task<string> GetDataAsync(int value); 
} 

public class Service1 : IService1 
{ 
    public async Task<string> GetDataAsync(int value) 
    { 
     await Task.Delay(value); 
     return string.Format("You entered and awaited: {0}", value); 
    } 
} 

Я все еще могу позвонить синхронный string GetData(int) метод от моего клиента

enter image description here

Примечание, вы не будете иметь возможность использовать один и тот же интерфейс и ServerSide на клиентской стороне больше представлять API (и вы действительно не должны, на стороне клиента интерфейс должен иметь как версии в нем. Таким образом, клиент может решить, хочет ли он сделать блокирующий вызов или нет). Тем не менее, вы все равно сможете использовать совместно используемые модели.

+0

Спасибо. Это очень близко к тому, что мне нужно, хотя, возможно, больше не может использовать один и тот же интерфейс для клиента и сервера, так как некоторые клиентские коды должны будут измениться. Одна вещь, которую я не понимаю, - это то, почему клиенты должны когда-либо знать или заботиться о том, являются ли вызовы на стороне сервера асинхронными или нет. Аналогично, асинхронный клиентский вызов не должен иметь эффекта или видимости с сервера. – RickNZ

+3

@RickNZ Вы правы, клиент не должен знать и не заботиться о том, что происходит на стороне сервера, поэтому вы обычно не используете один и тот же интерфейс на сервере для размещения службы WCF, как и на клиенте, чтобы потреблять WCF оказание услуг. Принуждение к использованию одного и того же интерфейса создает искусственное ограничение. И ни один код на стороне клиента не должен меняться, вы можете оставить клиента с помощью того же интерфейса, который вам нужен, чтобы написать новый внутренний интерфейс, который будет использовать сервер, который имеет те же сигнатуры метода, кроме добавления слова «Async» и возврата его задачи где это необходимо. –

+0

О, право. Хорошо, я попробую. – RickNZ

 Смежные вопросы

  • Нет связанных вопросов^_^