Silverlight项目中webservices的异步开始/结束模式

时间:2011-10-31 17:10:43

标签: silverlight web-services asynchronous

我发现使用SlSvcUtil.exe生成的代理(或通过添加对Web引用的引用)仅支持基于事件的异步模型,从设计的角度来看这绝对是不合适的(事件是从头几天开始的二等公民)。 / p>

我将实现F#的异步构建器方法,我发现“旧样式”的Begin / End更容易推广。我注意到SlSvcUtil.exe生成了Begin / End方法对,但是用private关键字标记它们?

我最喜欢的几个选项是:

  • 通过手动更新代理类来公开Begin / End方法
  • 使用wsdl.exe并为缺少的System.Web类创建包装器库
  • 使用其他通信协议(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&lt;&gt;继承的生成代码。文章http://msdn.microsoft.com/en-us/library/dd744834(v=vs.95).aspx详细介绍了这一点。

1 个答案:

答案 0 :(得分:2)

您可以使用通道工厂作为终点来访问开始/结束方法。

基本上只需创建一个新的ChannelFactory并传入绑定和终点。您可以使用主机源动态更新端点,因此它不是硬编码的。生成的实例将为您公开开始/结束方法。