如何使用 .NET Core MVC 框架将 TwiML 实现为方法?

Mar*_*ark 3 c# twilio asp.net-core-mvc twilio-twiml

我正在执行基于 Twilio 示例的代码,用于接收和响应此处找到的 SMS 消息: https ://www.twilio.com/docs/sms/tutorials/how-to-receive-and-reply-csharp

唯一的区别是我使用的是.NET MVC Core,而不是示例中提供的.NET MVC Framework 。我遇到问题的代码是:

    [HttpPost]
    public TwiMLResult Index(SmsRequest incomingrequest)
    {
        var messagingResponse = new MessagingResponse();
        messagingResponse.Message("The Robots are coming! Head for the Hills!");
        return TwiML(messagingResponse);
    }
Run Code Online (Sandbox Code Playgroud)

如果我将该方法封装在默认情况下继承自 ControllerBase 类的控制器类中;TwiML 被标识为基类,而不是导致错误的方法。

public class SmsResponseController : ControllerBase
{
    [HttpPost]
    public TwiMLResult Index(SmsRequest incomingrequest)
    {
        var messagingResponse = new MessagingResponse();
        messagingResponse.Message("The Robots are coming! Head for the Hills!");
        return TwiML(messagingResponse); -- <-- Error: Non-invokable member TwiML cannot be used like a method
    }

}
Run Code Online (Sandbox Code Playgroud)

因此,明确遵循示例,将继承从 ControllerBase 更改为 TwilioController 将解决此特定问题,并且 TwilML 被识别为具有 3 个潜在重载的方法。

public class SmsResponseController : TwilioController
{
    [HttpPost]
    public TwiMLResult Index(SmsRequest incomingrequest)
    {
        var messagingResponse = new MessagingResponse();
        messagingResponse.Message("The Robots are coming! Head for the Hills!");
        return TwiML(messagingResponse); -- Method recognized
    }
}
Run Code Online (Sandbox Code Playgroud)

但是尝试执行该程序现在将在 Program.cs 的主执行期间抛出错误 错误是

System.TypeLoadException:“无法从程序集“System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”加载类型“System.Web.HttpContextBase”。”

不幸的是,到目前为止我发现的帖子似乎都不适用于这种情况,也没有解决问题。

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}
Run Code Online (Sandbox Code Playgroud)

我只能猜测核心框架内某处代码的某些部分依赖于 ControllerBase 类的存在。

但是如何让示例执行时不会出现错误且不依赖于 ControllerBase?

现在看来是第 22 条军规的情况。

dpr*_*ero 5

还有另一个包可用于 ASP.NET Core: https: //www.nuget.org/packages/Twilio.AspNet.Core/

所以,你想要的代码将是这样的:

using Twilio.AspNet.Common;
using Twilio.AspNet.Core;
using Twilio.TwiML;

namespace TwilioReceive.Controllers
{
    public class SmsController : TwilioController
    {
        public TwiMLResult Index(SmsRequest incomingMessage)
        {
            var messagingResponse = new MessagingResponse();
            messagingResponse.Message("The copy cat says: " +
                                      incomingMessage.Body);

            return TwiML(messagingResponse);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有关使用 .NET Core 的更多文档,您可以查看此文档: https ://www.twilio.com/docs/sms/quickstart/csharp-dotnet-core