创建没有端点的WCF ChannelFactory?

时间:2018-03-22 21:13:44

标签: c# .net wcf

我读到我们不应该在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?

1 个答案:

答案 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 ) ) );
    }
}