我读到我们不应该在WCF客户端周围使用using。因此,我发现this awesome answer如何围绕它编写优雅的代码。
它并不完美,因为它不是异步的,也不返回任何值,所以我创建了我的版本(基于其他答案):
public static async Task<TReturn> UseServiceAsync<TChannel, TReturn>(Func<TChannel, Task<TReturn>> code)
{
ChannelFactory<TChannel> _channelFactory = new ChannelFactory<TChannel>("NetTcpBinding_IMyService");
TChannel channel = _channelFactory.CreateChannel();
bool success = false;
try
{
TReturn result = await code(channel);
((IClientChannel)channel).Close();
success = true;
return result;
}
finally
{
if (!success)
{
((IClientChannel)channel).Abort();
}
}
}效果很好但是..。我不想在ChannelFactory中指定我的端点。我已经提供了合同接口!完全可以转到配置文件并查找该端点。为什么我必须显式地指定它?
顺便说一下。在上面提到的答案中,有一个链接到这篇文章。他们做了这样的事情:
public static ChannelFactory<T> _channelFactory = new ChannelFactory<T>("");
这是怎么回事??我不知道..
我的问题是:如何在不显式传递端点名称的情况下创建ChannelFactory?
发布于 2018-03-22 21:48:01
ChannelFactory<TChannel>来自抽象类ChannelFactory。创建自定义派生类,并使用InitializeEndpoint调用初始化端点。
例如:
public class SomeChannelFactory : ChannelFactory
{
public SomeChannelFactory()
{
InitializeEndpoint( new BasicHttpBinding() , new EndpointAddress( "http://localhost/service" ) );
}
protected override ServiceEndpoint CreateDescription()
{
return new ServiceEndpoint( new ContractDescription( nameof( SomeChannelFactory ) ) );
}
}https://stackoverflow.com/questions/49438586
复制相似问题