Как реализовать TwiML как метод, используя. NET Core MVC Framework? - PullRequest
1 голос
/ 26 февраля 2020

Я выполняю код на основе примера 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, который по умолчанию наследуется от класса 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
    }

}

Таким образом, в явном виде, следуя примеру, изменение наследования от ControllerBase на TwilioController решит эту конкретную проблему c и 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 Ошибка:

Система .TypeLoadException: «Не удалось загрузить тип» System.Web.HttpContextBase 'из сборки' System.Web, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a '.'

и, к сожалению, не из постов, которые я нашел до сих пор, похоже, что они применимы к этому сценарию и не решают проблему.

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.

Но как я могу получить образец для выполнения без ошибок и де Зависит от ControllerBase?

Кажется прямо сейчас сценарий уловки 22.

1 Ответ

1 голос
/ 26 февраля 2020

Существует еще один пакет, который вы можете использовать для 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

...