我试图创建一个可以使用twilio API发送短信的应用程序
此API包含statusCallback属性,我们可以在其中包含API可以发送有关传递行为的数据的链接(如果收到短信等...)
public void sendSMS()
foreach (var toNumber in TOnumbersList)
{
var message = MessageResource.Create(
to: new PhoneNumber(toNumber),
from: new PhoneNumber(fromNumber),
body: msgBody,
provideFeedback: true,
statusCallback: new Uri("http://localhost:5000/"));// <----
}
你可以注意到,在statusCallback中,我预先确定了我想在localhost上发送信息:5000 /
在我的visual studio 2015解决方案资源管理器中,我添加了一个独立的项目,并将其命名为windows Service
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace WindowsService
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()
};
// ServiceBase.Run(ServicesToRun);
_httpListener.Prefixes.Add("http://localhost:5000/"); // add prefix "http://localhost:5000/"
_httpListener.Start(); // start server (Run application as Administrator!)
Console.WriteLine("Server started.");
Thread _responseThread = new Thread(ResponseThread);
_responseThread.Start(); // start the response thread
}
static HttpListener _httpListener = new HttpListener();
static void ResponseThread()
{
while (true)
{
HttpListenerContext context = _httpListener.GetContext(); // get a context
var a = context.Request.Url; // Now, you'll find the request URL in context.Request.Url
byte[] _responseArray = Encoding.UTF8.GetBytes("<html><head><title>Localhost server -- port 5000</title></head>" +
"<body>Welcome to the <strong>Localhost server</strong> -- <em>port 5000!</em></body></html>"); // get the bytes to response
context.Response.OutputStream.Write(_responseArray, 0, _responseArray.Length); // write bytes to the output stream
context.Response.KeepAlive = false; // set the KeepAlive bool to false
context.Response.Close(); // close the connection
Console.WriteLine("Respone given to a request.");
}
}
}
}
之后,在解决方案的配置中,我确保我希望服务在Windows窗体项目之前运行,如图中所示
所以,一旦我启动解决方案,我继续使用localhost:5000并注意到该服务正在运行,并且该页面正在显示一条欢迎消息
但是,一旦调用(或调用)sendSMS()函数(在服务运行时)我收到此错误:
错误:localhost上的状态回调不是有效的URL
所以我的问题是我做错了什么?我想了解我对网络服务技术不是很熟悉,我忘了启用某些功能吗?或者与异步和同步问题有关的事情?
注意:在过去,(而不是使用本地主机),我使用http://requestb.in/创建了一个URL(它完成了web服务的工作)并且我复制了创建的URL并且没有问题在链接上发送数据。但是当链接是localhost时,会发现问题
答案 0 :(得分:1)
“Localhost”解析为当前运行代码的计算机,即127.0.0.1(IPv4)和:: 1(IPv6)。
如果您将localhost传递给Twilio等远程服务,则远程服务会将“localhost”解析为127.0.0.1/::1,这本身也是如此。这没有任何意义,这也是Twilio拒绝URL的原因。
您指定的回调URL必须是公共的,并且可以从Twilios服务访问,否则这将无效。我通常使用廉价或免费的Azure网站进行此类测试。