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

How do you implement TwiML as a method using the .NET Core MVC Framework?

我正在执行基于 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);
    }

如果我将方法封装在 Controller 的 Class 中,它默认继承自 ControllerBase class; TwiML 被识别为基础 class 而不是导致错误的方法。

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
    }

}

因此明确遵循示例,将继承从 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
    }
}

但是尝试执行程序现在会在 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>();
            });
}

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

但是我怎样才能让示例在没有错误且不依赖于 ControllerBase 的情况下执行?

现在似乎是第 22 条军规。

还有另一个包可以用于 ASP.NET 核心: 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);
        }
    }
}

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