C# WCF 关闭 channel 并使用函数 Func<T>

标签 c# wcf func channelfactory

这就是重点,我有一个 WCF 服务,它现在正在运行。所以我开始在客户端工作。当应用程序运行时,出现异常:超时。所以我开始阅读,有很多关于如何保持连接的例子,但是,我也发现最好的方法是创建 channel ,使用它,然后处理它。老实说,我喜欢这样。因此,现在阅读有关关闭 channel 的最佳方法,有两个链接可能对任何需要它们的人都有用:

1. Clean up clients, the right way

2. Using Func

在第一个链接中,这是示例:

    IIdentityService _identitySvc;
...
if (_identitySvc != null)
 {
     ((IClientChannel)_identitySvc).Close();
     ((IDisposable)_identitySvc).Dispose();
     _identitySvc = null;
 }

因此,如果 channel 不为空,则关闭、处置并分配空值。但我有一个小问题。在这个例子中, channel 有一个 .Close() 方法,但在我的例子中,intellisense 没有显示 Close() 方法。它只存在于工厂对象中。所以我相信我必须写它。但是,在具有契约的接口(interface)或实现它的类中??。而且,这个方法应该做什么??。

现在,下一个链接,这是我以前没有尝试过的东西。 Func<T> .而且看完球门,还蛮有意思​​的。它创建了一个函数,该函数使用 lambdas 创建 channel 、使用它、关闭它并处理它。这个例子像Using()一样实现了这个功能陈述。这真的很好,而且是一个很好的改进。但是,我需要一点帮助,老实说,我无法理解该功能,因此,专家的一些解释将非常有用。这是函数:

TReturn UseService<TChannel, TReturn>(Func<TChannel, TReturn> code)
{
    var chanFactory = GetCachedFactory<TChannel>();
    TChannel channel = chanFactory.CreateChannel();
    bool error = true; 
    try {
        TReturn result = code(channel); 
        ((IClientChannel)channel).Close();
        error = false; 
        return result; 
    }
    finally {
        if (error) {
            ((IClientChannel)channel).Abort();
        }
    }
}

这是如何使用的:

int a = 1; 
int b = 2; 
int sum = UseService((ICalculator calc) => calc.Add(a, b)); 
Console.WriteLine(sum);

是的,我认为它真的非常好,我想了解它以便在我的项目中使用它。

而且,一如既往,我希望这对很多人有所帮助。

最佳答案

UseService 方法接受一个委托(delegate),它使用 channel 发送请求。委托(delegate)有一个参数和一个返回值。您可以在委托(delegate)中调用 WCF 服务。

并且在 UseService 中,它创建 channel 并将 channel 传递给委托(delegate),这应该由您提供。调用结束后关闭 channel 。

关于C# WCF 关闭 channel 并使用函数 Func<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6728212/

相关文章:

c# - 在 C# 中使用 Dictionary<T, Func<List, bool>> 查找列表中最常见的事件

c# - 如何对任意查询执行计数(可能包含排序依据)

c# - 我在 vs2008 中学习 C#,而 vs2010 可用。我错过了什么吗?

c# - 全新 ASP.NET Core 2.1 项目的构建时间缓慢

c# - ssl channel wcf web api?

c# - 等待异步 WCF 方法

c# - 使用 Func 设置对象的属性

C# 和 Razor - 您请求的页面类型未提供,因为它已被明确禁止。扩展名 '.cshtml' 可能不正确

web-services - <故障代码 xmlns :a ="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">a:InvalidSecurity</faultcode>

C# 将 System.Func<Tderived, bool> 转换为 System/Func<Tbase, bool>