最近因为有客户需要接入语音服务(在线打电话),综合了市面上的产品,最后还是选择了阿里云的语音服务。阿里云的业务比较广泛,说实话找官网的SDK文档确实很浪费时间,其实接入并不复杂,但是官网的SDK示例并不是完全的契合asp.net core还是需要自己改造代码的,但是在改造代码的时候我因为是直接通过NuGet 安装的AlibabaCloud.SDK.DyvmsApi20170525,改造好的代码一直提示:MissingMethodException: Method not found: 'Void Aliyun.Credentials.Client..ctor(Aliyun.Credentials.Models.Config)'. 搞的我一直以为是自己的代码有问题,白白浪费了好几天。所以我这里还是推荐大家通过官网的SDK给出的dotnet add package AlibabaCloud.SDK.Dyvmsapi20170525 --version 3.2.2命令来安装。正确安装完成后的截图如下

安装好了阿里云的SDK然后在Program.cs注册/配置一下IvrCall 的单例服务。代码如下
// 注册IVR客户端 builder.Services.AddSingLeton<Client>(sp => { // 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/378671.html。 Aliyun.Credentials.Client credential = new Aliyun.Credentials.Client( new Aliyun.Credentials.Models.Config() { Type = "access_key", AccessKeyId = "AccessKeyId ", AccessKeySecret = "AccessKeyId " } ); AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config { Credential = credential, }; // Endpoint 请参考 https://api.aliyun.com/product/Dyvmsapi config.Endpoint = "dyvmsapi.aliyuncs.com"; return new AlibabaCloud.SDK.Dyvmsapi20170525.Client(config); });
我这里使用的是明文写入AccessKeyId,您也可以根据实际情况按照选择更安全的方式。
然后我们开始正式编写发送代码了,您也可以通过IvrCall_云通信语音服务_API调试-阿里云OpenAPI开发者门户调试好发送代码的各项参数。我写的函数如下
    public class HomeController(Client ivrClient) : Controller
    {
        private readonly Client _ivrClient = ivrClient;
        /// <summary>
        /// 发起IVR呼叫
        /// </summary>
        /// <param name="request">IVR呼叫参数 https://next.api.aliyun.com/api/Dyvmsapi/2017-05-25/IvrCall?RegionId=cn-hangzhou</param>
        /// <returns>呼叫结果</returns>
        [HttpPost]
        [HttpGet]
        [Route("/Call/")]
        public Async Task<IActionResult> Call(IvrCallRequest request)
        {
            AlibabaCloud.SDK.Dyvmsapi20170525.Client client = _ivrClient;
            AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest.IvrCallRequestMenuKeyMap menuKeyMap0 = new AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest.IvrCallRequestMenuKeyMap
            {
                Key = "1",
                Code = "TTS_xxxx",
            };
            AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest.IvrCallRequestMenuKeyMap menuKeyMap1 = new AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest.IvrCallRequestMenuKeyMap
            {
                Key = "0",
                Code = "TTS_xxxx",
            };
            AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest ivrCallRequest = new AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest
            {
                CalledShowNumber = "05715xxx172",
                CalledNumber = "1906xxxx955",
                StartCode = "TTS_xxx",
                StartTtsParams = "{\"address\":\"资溪县\",\"times\":\"2012年12月30日\",\"hour\":\"3\"}",
                OutId = "fdf",
                MenuKeyMap = new List<AlibabaCloud.SDK.Dyvmsapi20170525.Models.IvrCallRequest.IvrCallRequestMenuKeyMap>
                {
                    menuKeyMap0,
                    menuKeyMap1
                },
            };
            AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            try
            {
                // 复制代码运行请自行打印 API 的返回值
                Var response = Await client.IvrCallWithOptionsAsync(ivrCallRequest, runtime);
                return Ok(new
                {
                    Success = true,
                    response.Body.RequestId,
                    response.Body.Code,
                    response.Body.Message
                });
            }
            catch (TeaException error)
            {
                // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
                // 错误 message
                Console.WriteLine(error.Message);
                // 诊断地址
                Console.WriteLine(error.Data["Recommend"]);
                AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
                return Ok(new
                {
                    error.Message
                });
        
            }
            catch (Exception _error)
            {
                TeaException error = new TeaException(new Dictionary<string, object>
                {
                    { "message", _error.Message }
                });
                // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
                // 错误 message
                Console.WriteLine(error.Message);
                // 诊断地址
                Console.WriteLine(error.Data["Recommend"]);
                AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
                return Ok(new
                {
                    _error.Message
                });
            }
        }
    }打开测试,电话拨打成功。我着唯一的坑就是安装sdk的时候,可能是选错sdk或则什么原因,一直报错,最后还是把所有的sdk删除,然后通过命令行的方式安装了sdk才正常,具体原因也不清楚。
