C# 如何从MVC4 WebAPI异步调用WCF方法

C# 如何从MVC4 WebAPI异步调用WCF方法,c#,wcf,asp.net-mvc-4,async-await,twilio,C#,Wcf,Asp.net Mvc 4,Async Await,Twilio,我是WebApi、.Net世界的新手,对于我应该采取什么方法的所有可用信息,我完全感到困惑。我已经使用MVC4WebAPI创建了一个WebService,Twilio在收到文本消息时调用它。我需要回复这条短信。我正在使用当前正在同步调用的WCF方法。由于我的处理过程可能需要3-5秒以上的时间来处理对文本消息的回复,因此到Twilio的连接会因超时而断开。因此,我正在寻找异步调用此WCF方法的方法。 我的问题是调用WCF方法(我使用对象工厂和 我是否需要更新合同以表示异步?我对此有点困惑 顺便说一

我是WebApi、.Net世界的新手,对于我应该采取什么方法的所有可用信息,我完全感到困惑。我已经使用MVC4WebAPI创建了一个WebService,Twilio在收到文本消息时调用它。我需要回复这条短信。我正在使用当前正在同步调用的WCF方法。由于我的处理过程可能需要3-5秒以上的时间来处理对文本消息的回复,因此到Twilio的连接会因超时而断开。因此,我正在寻找异步调用此WCF方法的方法。 我的问题是调用WCF方法(我使用对象工厂和 我是否需要更新合同以表示异步?我对此有点困惑

顺便说一句,我的Web服务在IIS7和am中使用.Net4.5框架和MVC4 WebApi

我的代码有点像这样:所以我想异步调用SendSms部分。我该怎么做?我可以简单地使用Task.runasync并等待吗

 using Twilio.Mvc;
 using Twilio.TwiML.Mvc;
 using Twilio.TwiML;


public class SmsController : ApiController
{
    [HttpPost]
    public HttpResponseMessage Post([FromBody]SmsRequest smsReq)
    {
            var response = new Twilio.TwiML.TwilioResponse();
            //validation checks..

            try
            {

                -- call to WCF to get the List of sms to be sent 
                if ((txtMessageResponse != null) && (txtMessageResponse.SmsMessageInfo.Count > 0))
                {
                    _smsStagingList = txtMessageResponse.SmsMessageInfo;
                    foreach (TextMessageStaging prepareTextMessageResponse in _smsStagingList)
                    {
                        smsDTO textMessageItems = new smsDTO();
                        textMessageItems.PhoneNumber = prepareTextMessageResponse.PhoneNumber;
                        textMessageItems.SmsMessage = prepareTextMessageResponse.SmsMessageBody;

                        isTxtMessageSent = SendSms(textMessageItems);

                        //If the messages were sent then no need to set the flag to be updated 
                        if (isTxtMessageSent)
                        {
                            txtMessageStatusToBeUpdated = false;
                        }
                    }
                    return Request.CreateResponse(HttpStatusCode.OK, twilioResponse.Element);
                }
                else
                {
                    //send error response
                }
            catch (Exception msgProcessingError)
            {
              //send error response again as processing error
            }
            finally
            {
             //set the outbound flag in the table
            }
     }


    private bool SendSms(smsDTO textMessageItems)
    {
        bool isTxtMessageSent = false;
        PushMessageRequest txtMessageRequest = new PushMessageRequest();
        PushMessageResponse txtMessageResponse = null;
        txtMessageRequest.SmsMessageInfo = new SendTextMessage(); //instantiate the dto

        txtMessageRequest.SmsMessageInfo.ToPhone = textMessageItems.PhoneNumber;
        txtMessageRequest.SmsMessageInfo.TextMessage = textMessageItems.SmsMessage;
        try
        {
            using (ITextService textService = ObjectFactory.SendSmsMessage())
            {
                txtMessageResponse = textService.SendSmsMessage(txtMessageRequest);
            }

            isTxtMessageSent = txtMessageResponse.IsSuccessful;
        }
        catch (Exception ex)
        {
            isTxtMessageSent = false;
        }      
        return isTxtMessageSent;
    }          

这里是Twilio福音传道者

好的,您有一个WebAPI方法,在该方法中您调用一个可能长期运行的WCF方法。这里有两个问题需要解决:

  • 如何以不阻止WebAPI方法返回响应的方式调用WCF方法
  • 如何让Twilio等到WCF方法完成
  • 我不久前写过一篇文章,向您展示了如何通过利用.NET和Twilios谓词上的属性在IVR中创建无限等待循环

    本文的要点是,您可以使用TPL的方法在新线程上启动长时间运行的WCF方法。这允许ASP.NET继续,并允许您返回一些TwiML,以便Twilio不会结束调用。然后将其与一个配对,它让您知道WCF服务请求何时完成,并且您可以使用RESTAPI向Twilio发回信号,以发送到一组新的TwiML指令


    希望这能有所帮助。

    两个澄清问题。您是否使用ASP.NET Web API或WCF创建服务?另外,您是否知道在服务内部调用的特定方法可能会长期运行?@DevinRader-我正在使用ASP.NET Web API创建服务。但是在我的HTTP帖子中,我实现了一个驻留在WCF.Nice博客帖子中的方法。但是博客展示了当来电者在等待来电者回复时该怎么做。在我的情况下,这是一个短信。那么我可以返回什么TwiML消息呢?另外请注意,我实际上不打算通过TwiML返回任何内容,但我将使用Twilio Rest API将消息作为回复发送出去,即发送消息。这是因为对于传入的文本,我可能有超过10条短信作为回复发送,这是TwiML api中的一个限制。基本上,我认为我需要一些可以触发并忘记的东西,除非我们有其他方法告诉twilio等待回复。我不知道除了短信动词外,我们还能用什么动词。因为我相信我们不能将重定向和Sms动词一起使用。啊,好的。在这种情况下,你不能通过一个纯TwiML响应来实现。但是你可以通过稍微修改一下文章中的代码来做到这一点。首先,由于这是我们正在讨论的SMS,您不需要从ASP.NET方法返回任何内容。其次,在继续中,您需要使用RESTAPI发送回复短信,而不是通过API修改调用。希望能有帮助。这正是我想做的。但我们希望通过异步方法发送它,因为当消息通过Twilio Rest API发送时,发送每条文本消息大约需要1秒。因此,如果我有大约15-20条信息要发送出去,那么它需要更多的时间,我与Twilio的连接超时。因此,我们希望调用Twilio Rest Api以异步发送消息。这有意义吗?因此,我的问题是异步发送,我应该使用什么方法来实现与Fire and Forget相同的功能?对于您的评论有点困惑:“您需要使用REST API来发送回复短信,而不是通过API修改调用”-您指的是回退回复还是实际回复?