错误:localhost上的状态回调不是有效的URL

时间:2017-03-09 21:12:54

标签: c# web-services callback windows-services localhost

我试图创建一个可以使用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窗体项目之前运行,如图中所示

enter image description here

所以,一旦我启动解决方案,我继续使用localhost:5000并注意到该服务正在运行,并且该页面正在显示一条欢迎消息

但是,一旦调用(或调用)sendSMS()函数(在服务运行时)我收到此错误:

  

错误:localhost上的状态回调不是有效的URL

所以我的问题是我做错了什么?我想了解我对网络服务技术不是很熟悉,我忘了启用某些功能吗?或者与异步和同步问题有关的事情?

注意:在过去,(而不是使用本地主机),我使用http://requestb.in/创建了一个URL(它完成了web服务的工作)并且我复制了创建的URL并且没有问题在链接上发送数据。但是当链接是localhost时,会发现问题

1 个答案:

答案 0 :(得分:1)

“Localhost”解析为当前运行代码的计算机,即127.0.0.1(IPv4)和:: 1(IPv6)。

如果您将localhost传递给Twilio等远程服务,则远程服务会将“localhost”解析为127.0.0.1/::1,这本身也是如此。这没有任何意义,这也是Twilio拒绝URL的原因。

您指定的回调URL必须是公共的,并且可以从Twilios服务访问,否则这将无效。我通常使用廉价或免费的Azure网站进行此类测试。