twilio - 示例代码项目无法编译
问题描述
我正在尝试编译这个项目- “AirTNG 应用程序:第 1 部分 - 使用 Twilio 的工作流自动化 - ASP.NET MVC”。
我在 Notifier.cs 第 40 行看到有一个_client.SendMessage
. 但是它没有构建,因为 TwilioRestClient 类中似乎没有方法可以解析为“SendMessage”。
[使用版本 15.1.0 的 Twilio 程序集。]
以下是通知程序的代码:
using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Services.Description;
using AirTNG.Web.Domain.Twilio;
using AirTNG.Web.Models;
using AirTNG.Web.Models.Repository;
using Twilio;
using Twilio.Clients;
namespace AirTNG.Web.Domain.Reservations
{
public interface INotifier
{
Task<Message> SendNotificationAsync(Reservation reservation);
}
public class Notifier : INotifier
{
private readonly TwilioRestClient _client;
private readonly IReservationsRepository _repository;
public Notifier() : this(
new TwilioRestClient(Credentials.AccountSid, Credentials.AuthToken),
new ReservationsRepository()) { }
public Notifier(TwilioRestClient client, IReservationsRepository repository)
{
_client = client;
_repository = repository;
}
public async Task<Message> SendNotificationAsync(Reservation reservation)
{
var pendingReservations = await _repository.FindPendingReservationsAsync();
if (pendingReservations.Count() > 1) return null;
var notification = BuildNotification(reservation);
return _client.SendMessage(notification.From, notification.To, notification.Messsage);
}
private static Notification BuildNotification(Reservation reservation)
{
var message = new StringBuilder();
message.AppendFormat("You have a new reservation request from {0} for {1}:{2}",
reservation.Name,
reservation.VacationProperty.Description,
Environment.NewLine);
message.AppendFormat("{0}{1}",
reservation.Message,
Environment.NewLine);
message.Append("Reply [accept] or [reject]");
return new Notification
{
From = PhoneNumbers.Twilio,
To = reservation.PhoneNumber,
Messsage = message.ToString()
};
}
}
}
以下是我packages.config
在更新所有软件包的最新稳定版后的原样内容。
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Antlr" version="3.5.0.2" targetFramework="net451" />
<package id="bootstrap" version="4.1.3" targetFramework="net471" />
<package id="EntityFramework" version="6.2.0" targetFramework="net471" />
<package id="FontAwesome" version="4.7.0" targetFramework="net471" />
<package id="jQuery" version="3.3.1" targetFramework="net471" />
<package id="jQuery.Validation" version="1.17.0" targetFramework="net471" />
<package id="Microsoft.AspNet.Identity.Core" version="2.2.2" targetFramework="net471" />
<package id="Microsoft.AspNet.Identity.EntityFramework" version="2.2.2" targetFramework="net471" />
<package id="Microsoft.AspNet.Identity.Owin" version="2.2.2" targetFramework="net471" />
<package id="Microsoft.AspNet.Mvc" version="5.2.6" targetFramework="net471" />
<package id="Microsoft.AspNet.Razor" version="3.2.6" targetFramework="net471" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebPages" version="3.2.6" targetFramework="net471" />
<package id="Microsoft.IdentityModel.JsonWebTokens" version="5.2.4" targetFramework="net471" />
<package id="Microsoft.IdentityModel.Logging" version="5.2.4" targetFramework="net471" />
<package id="Microsoft.IdentityModel.Tokens" version="5.2.4" targetFramework="net471" />
<package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.10" targetFramework="net471" />
<package id="Microsoft.Owin" version="4.0.0" targetFramework="net471" />
<package id="Microsoft.Owin.Host.SystemWeb" version="4.0.0" targetFramework="net471" />
<package id="Microsoft.Owin.Security" version="4.0.0" targetFramework="net471" />
<package id="Microsoft.Owin.Security.Cookies" version="4.0.0" targetFramework="net471" />
<package id="Microsoft.Owin.Security.Facebook" version="4.0.0" targetFramework="net471" />
<package id="Microsoft.Owin.Security.Google" version="4.0.0" targetFramework="net471" />
<package id="Microsoft.Owin.Security.MicrosoftAccount" version="4.0.0" targetFramework="net471" />
<package id="Microsoft.Owin.Security.OAuth" version="4.0.0" targetFramework="net471" />
<package id="Microsoft.Owin.Security.Twitter" version="4.0.0" targetFramework="net471" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net451" />
<package id="Modernizr" version="2.8.3" targetFramework="net451" />
<package id="Newtonsoft.Json" version="11.0.2" targetFramework="net471" />
<package id="Owin" version="1.0" targetFramework="net451" />
<package id="popper.js" version="1.14.3" targetFramework="net471" />
<package id="Portable.BouncyCastle" version="1.8.2" targetFramework="net471" />
<package id="Portable.JWT" version="1.0.5" targetFramework="net451" />
<package id="Respond" version="1.4.2" targetFramework="net451" />
<package id="RestSharp" version="106.3.1" targetFramework="net471" />
<package id="System.IdentityModel.Tokens.Jwt" version="5.2.4" targetFramework="net471" />
<package id="Twilio" version="5.15.1" targetFramework="net471" />
<package id="Twilio.AspNet.Common" version="5.8.3" targetFramework="net471" />
<package id="Twilio.AspNet.Mvc" version="5.9.7" targetFramework="net471" />
<package id="WebGrease" version="1.6.0" targetFramework="net451" />
</packages>
解决方案
原始示例是在 API 的第 4 版中编写的。因此,为了使其适用于版本 5,我进行了一些更改。
通知程序的更新代码:
using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AirTNG.Web.Domain.Twilio;
using AirTNG.Web.Models;
using AirTNG.Web.Models.Repository;
using Twilio.Clients;
using Twilio.Rest.Api.V2010.Account;
namespace AirTNG.Web.Domain.Reservations
{
public interface INotifier
{
Task<MessageResource> SendNotificationAsync(Reservation reservation);
}
public class Notifier : INotifier
{
private readonly TwilioRestClient _client;
private readonly IReservationsRepository _repository;
public Notifier() : this(
new TwilioRestClient(Credentials.AccountSid, Credentials.AuthToken),
new ReservationsRepository())
{
}
public Notifier(TwilioRestClient client, IReservationsRepository repository)
{
_client = client;
_repository = repository;
}
public async Task<MessageResource> SendNotificationAsync(Reservation reservation)
{
var pendingReservations = await _repository.FindPendingReservationsAsync();
if (pendingReservations.Count() > 1) return null;
var notification = BuildNotification(reservation);
var message = await MessageResource.CreateAsync(
body: notification.Messsage,
from: notification.From,
to: notification.To,
client: _client
);
return message;
}
private static Notification BuildNotification(Reservation reservation)
{
var message = new StringBuilder();
message.AppendFormat("You have a new reservation request from {0} for {1}:{2}",
reservation.Name,
reservation.VacationProperty.Description,
Environment.NewLine);
message.AppendFormat("{0}{1}",
reservation.Message,
Environment.NewLine);
message.Append("Reply [accept] or [reject]");
return new Notification
{
From = PhoneNumbers.Twilio,
To = reservation.PhoneNumber,
Messsage = message.ToString()
};
}
}
}
推荐阅读
- python - Pandas Groupby 中的线性回归,freq='W-MON'
- python - pandas 中是否有一个函数可以转换以 CST 作为时区的时间戳?
- angular - 如何更改订阅中的顺序?
- c# - 如何获取 Python 脚本返回值以在 Visual Studio 表单中使用?
- reactjs - 使用 Express 和 Spring Boot 双后端进行单反应项目
- javascript - 如何在不知道 mongodb 中的父键的情况下查找特定的嵌套对象
- jupyter - 当 Jupyter 从 Ubuntu WSL 运行时,如何访问存储在 Windows 中的 Jupyter Notebook?
- node.js - 如何在控制台中显示随着时间变化而继续更新的正常运行时间?
- c# - 不一致的 JSON
- sql - Django App - 全新汽车计算器 - SQL 或 OOP 结构?