Асинхронный шаблон начала / окончания для веб-сервисов в проекте silverlight

#silverlight #web-services #asynchronous

#silverlight #веб-сервисы #асинхронный

Вопрос:

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

Я собираюсь реализовать подход асинхронного конструктора F #, и я обнаружил, что «старый стиль» Begin / End намного проще обобщить. Я замечаю SlSvcUtil.exe генерирует пару методов Begin / End, но помечает их оба закрытым ключевым словом?

У меня в голове есть пара вариантов:

  • предоставьте начальные / конечные методы, обновив класс прокси вручную
  • использование wsdl.exe и создайте библиотеку-оболочку для отсутствующей системы.Веб-классы
  • используйте другие протоколы связи (HttpClient, Tcp)
  • используйте сторонние прокси (пока не удалось найти ни одного)

Есть идеи?

Скажем, кто-то создал удаленную службу одним методом:

 public interface CompressService
{
    public byte[] Compress(byte[] inData);
}
  

После SlSvcUtil я получил:

 public class CompressServiceSoapClient: ClientBase<CompressServiceSoap...
{
    private BeginOperationDelegate onBeginCompressDelegate;
    private EndOperationDelegate onEndCompressDelegate;
    public event System.EventHandler<CompressCompletedEventArgs> CompressCompleted;
    public void CompressAsync(byte[] inData, object userState);
}
  

Хотя на самом деле мне нужно:

 public class CompressServiceSoapClient: ClientBase<CompressServiceSoap...
{
    public IAsyncResult BeginCompress(byte[] inData, System.AsyncCallback callback, object asyncState);
    public byte[] EndCompress(IAsyncResult result);
}
  

Ответ

Решение состоит в том, чтобы объявить интерфейс контракта с помощью асинхронных методов и не использовать сгенерированный код, унаследованный от ClientBase<> . Статья http://msdn.microsoft.com/en-us/library/dd744834 (v = против 95).aspx описывает это более подробно.

Ответ №1:

Вы можете получить доступ к методам начала / окончания, используя фабрику каналов для конечной точки.

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

Комментарии:

1. Я не вижу, как это отвечает моим потребностям? Мне все еще нужно перенести параметры в экземпляр запроса / тела. Пожалуйста, взгляните на пример выше.

2. Джереми, я нашел msdn.microsoft.com/en-us/library/dd744834 (v = против 95).aspx отвечает моим потребностям. Вы имели в виду этот подход без автоматически сгенерированного кода?

3. И еще одна ссылка russelleast.wordpress.com/2010/02/27 /…