Вопрос: как при использовании опции "/async" в утилите svcutil заставить генерить в составе интерфейсов на стороне клиента методы асинхронного паттерна только для определенных методов, а не для всех?
А теперь чуток поподробнее, где у меня случился затык. Пытаюсь понять, как использовать двусторонний
асинхронный интерфейс в WCF. Объявил на стороне сервиса два интерфейса, прямой и обратный:
[ServiceContract(CallbackContract = typeof(IServiceCallback))]
public interface IService
{
[OperationContract()]
string TestService(string value);
}
public interface IServiceCallback
{
[OperationContract()]
string TestClient(string value);
}
На стороне клиента при помощи svcutil сгенерил прокси. Приводить что получилось не буду, но главное, я использовал опции "/async" + "/tcv:Version35".
Реализовал сервис на стороне клиента:
public class Client : IServiceCallback
{
ServiceClient _serviceClient;
public CfgIC()
{
var instanceContext = new InstanceContext(this);
_serviceClient = new ServiceClient(instanceContext);
}
public string Test(string value)
{
return "Hail to service from client!";
}
}
И обнаружил проблему: ключ "/async" svcutil сгенерил асинхронные методы не только для прямого сервисного интерфейса
IService, но также и для обратного —
IServiceCallback. Но если начинку для асинхронного вызова прямого интерфейса — прокси — svcutil сгенерил сам, то вот реализовать методы асинхронного паттерна он требует от меня самостоятельно. Я-то, в принципе, не против, но асинхронные методы в
IServiceCallback я все равно использовать не буду. Короче,
компилятор ругается, что Client не реализует член интерфейса IServiceCallback.BeginTestClient и IServiceCallback.EndTestClient!
Отсюда мой вопрос, заданный в начале сообщения. Или предложите иной способ решить данную проблему.
Или придется
отказаться от использования svcutil и объявлять интерфейсы на стороне клиента
вручную?
Здравствуйте, Fortnum, Вы писали:
F>Я-то, в принципе, не против, но асинхронные методы в IServiceCallback я все равно использовать не буду. Короче, компилятор ругается, что Client не реализует член интерфейса IServiceCallback.BeginTestClient и IServiceCallback.EndTestClient!
F>Отсюда мой вопрос, заданный в начале сообщения. Или предложите иной способ решить данную проблему.
1)
Внутри асинхронных методов:
throw new NotImplementedException()
2)
delegateType OpDelegate = Op;
IAsyncResult BeginOp(params, AsyncCallback callback, object asyncState)
{
return OpDelegate.BeginInvoke(params, callback, asyncState);
}
ResultType EndOp(IAsyncResult ar)
{
return OpDelegate.EndInvoke(ar);
}
В общем, я понял, что гораздо серьёзнее проблема с тем, что
из 20 методов мне асинхронно вызывать надо 1-2. И стал писать
класс прокси клиента вручную (заодно научусь).
А еще, кажись, идет типа "война", между теми кто вручную
их пишет и теми, кто автоматически генерит
Или
мне так показалось из форумов и статей?