【发布时间】: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