【问题标题】:Asynchronous Begin/End pattern for webservices in silverlight projectSilverlight 项目中 Web 服务的异步开始/结束模式
【发布时间】:2011-10-31 17:10:43
【问题描述】:

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

我将实现 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的生成代码。文章http://msdn.microsoft.com/en-us/library/dd744834(v=vs.95).aspx 对此进行了更详细的描述。

【问题讨论】:

    标签: silverlight web-services asynchronous


    【解决方案1】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    相关资源
    最近更新 更多