我发现使用SlSvcUtil.exe生成的代理(或通过添加对Web引用的引用)仅支持基于事件的异步模型,从设计的角度来看这绝对是不合适的(事件是从头几天开始的二等公民)。 / p>
我将实现F#的异步构建器方法,我发现“旧样式”的Begin / End更容易推广。我注意到SlSvcUtil.exe生成了Begin / End方法对,但是用private关键字标记它们?
我最喜欢的几个选项是:
有什么想法吗?
假设某人使用一种方法创建了远程服务:
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详细介绍了这一点。
答案 0 :(得分:2)
您可以使用通道工厂作为终点来访问开始/结束方法。
基本上只需创建一个新的ChannelFactory并传入绑定和终点。您可以使用主机源动态更新端点,因此它不是硬编码的。生成的实例将为您公开开始/结束方法。