我有一个动词,我需要用西班牙语阅读。但是,Twilio .Net解析器在给定编码中使用无效字符失败。失败的行(为简洁而编辑)是:
> <Say voice="man" language="es">cita para la instalación de alfombra,
> el lunes, 15 de enero</Say>
我的XML定义为<?xml version="1.0" encoding="utf-8"?>
如何让Twilio .Net库正确解析该字符?如果我将它直接放在TWIML bin中,那么,.Net SDK无法解析它。
更新:添加代码示例
我使用帮助程序库生成VoiceResponse对象并通过webhook返回它们。例如:
foreach (var (translation, date) in installations)
{
gather.Append(new Say($"{translation} {SpanishDate(date)}", Say.VoiceEnum.Man, language: "es"));
}
public static string SpanishDate(DateTime date)
{
return $"el {date.ToString("dddd", new CultureInfo("es-ES"))}, {(date.Day == 1 ? "primo" : date.Day.ToString())} de {date.ToString("MMMM", new CultureInfo("es-ES"))}";
}
我正在查看帮助程序库返回的结果XML,即:
<Say voice="man" language="es">Cita para la instalacion de pisos de madera el miércoles, 28 de febrero</Say>
VoiceResponse对象生成的XML(使用ToString()方法)存储在blob存储中,直到调用完成,然后在webhook中作为TwiMLResult返回。
在帮助程序库的TwiMLResult构造函数中抛出异常,该构造函数试图解析XML并且失败。
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.InvalidCharRecovery(Int32& bytesCount, Int32& charsCount)
at System.Xml.XmlTextReaderImpl.GetChars(Int32 maxCharsCount)
at System.Xml.XmlTextReaderImpl.ReadData()
at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars)
at System.Xml.XmlTextReaderImpl.FinishPartialValue()
at System.Xml.XmlTextReaderImpl.get_Value()
at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r)
at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o)
at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options)
at Twilio.AspNet.Mvc.TwiMLResult.LoadFromString(String twiml, Encoding encoding)
at Twilio.AspNet.Mvc.TwiMLResult..ctor(String twiml)
答案 0 :(得分:1)
在看了@Marcos如何做他的样本后,我发现当我在TwiMLResult中返回预渲染的XML时,我没有将编码设置为UTF8。正确的方法是(例子):
var xml = voiceResponse.ToString();
var result = new TwiMLResult(xml, Encoding.UTF8);
答案 1 :(得分:0)
Twilio开发者传道者在这里。
查看您发布的示例,通过使用您可以找到here的帮助程序库,您似乎不会生成TwiML。您可以通过运行:
来安装它 Install-Package Twilio
我使用相同的字符串编写了一个示例应用程序,并生成了正确的XML。
public IActionResult Index()
{
var response = new VoiceResponse();
response.Say("cita para la instalación de alfombra, el lunes, 15 de enero!", language: "es");
return Content(response.ToString(), "text/xml");
}
以上回报:
<?xml version="1.0" encoding="utf-8"?>
<Response>
<Say language="es">cita para la instalación de alfombra, el lunes, 15 de enero!</Say>
</Response>
希望这会对你有所帮助。