我读到我们不应该在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?
答案 0 :(得分:1)
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 ) ) );
}
}