在freeswitch托管模块中没有持续时间

时间:2016-09-11 10:04:46

标签: c# freeswitch

我正在为FreeSwitch编写一个托管模块(它在C#中,但我想这适用于其他语言)而且我在挂断过程中没有得到持续时间:

    public void Run(AppContext context)
    {
        context.Session.HangupFunction = () => Hangup(context.Session);
        HandleCall(context.Session);
    }

    private void Hangup(ManagedSession session)
    {
        Log.WriteLine(LogLevel.Info, "Hanging up");
        Log.WriteLine(LogLevel.Info, "Created time: " + session.Variables.CreatedTime);
        Log.WriteLine(LogLevel.Info, "Answered time: " + session.Variables.AnsweredTime);
        Log.WriteLine(LogLevel.Info, "Hangup time: " + session.Variables.HangupTime);
        Log.WriteLine(LogLevel.Info, "Duration: " + session.GetVariable("duration"));
    }

CreatedTime和AnsweredTime都已设置。但是挂断时间和持续时间都是空的。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

基本上它是一个捕获22。您正在编写一个处于EXECUTE状态的应用程序,并且当它指示更改为HANGUP状态时,您已要求回调运行,但该回调必须在其仍然在您的应用程序中时运行,该回调必须在它从EXECUTE更改之前挂断。一旦退出回调,应用程序将退出,然后它将更改为HANGUP并处理所有其他挂断的东西。如果我们之后调用了您的函数,那么您要查询的所有内容都将被拆除。

因此,基本上可以假设函数运行的当前时间在实际挂起时间的几微秒内,具体取决于您在函数中阻塞的时间长短。如果您正在尝试执行类似CDR或呼叫处理的任何操作,则无论如何都不应该在那里进行。相反,您可以为CS_REPORTING注册api_hangup_hook或状态处理程序,其中将捕获所有数据并将其存在于来自应用程序的单独逻辑流中。这是设计的。