最近因为有客户需要接入语音服务(在线打电话),综合了市面上的产品,最后还是选择了阿里云的语音服务。阿里云的业务比较广泛,说实话找官网的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才正常,具体原因也不清楚。