#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 /…