我发现使用SlSvcUtil.exe生成的代理(或者通过添加对Web引用的引用)只支持基于事件的异步模型,从设计角度来看这是绝对不合适的(事件从最初的开始就属于二等公民)。
我将实现F#的异步构建器方法,我发现“旧风格”的开始/结束更容易推广。我注意到SlSvcUtil.exe生成Begin/End方法对,但是用私有关键字标记它们。
我头顶上的几个选择是:
有什么想法吗?
假设有人用一种方法创建了一个远程服务:
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的文章更详细地描述了这一点。
发布于 2011-10-31 17:22:47
您可以使用通道工厂作为端点来访问begin/end方法。
基本上,只需创建一个新的ChannelFactory并传入绑定和端点。您可以使用主机源动态更新端点,这样就不是硬编码了。生成的实例将为您公开begin/end方法。
https://stackoverflow.com/questions/7957081
复制相似问题