首页 文章

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

提问于
浏览
0

我是WebApi,.Net世界的新手,并且对于我应该采取什么方法的所有可用信息完全混淆 . 我使用MVC4 WebApi创建了一个WebService,Twilio在收到短信时会调用它 . 我需要回复此短信 . 我正在使用当前被同步调用的WCF方法 . 由于我的进程可能需要超过3-5秒才能处理对文本消息的回复,因此Twilio的连接会因超时而断开连接 . 所以我正在寻找异步调用此WCF方法的方法 . 我的问题是调用WCF方法(我使用对象工厂调用WCF并使用)我是否需要更新 Contract 以说Async?我对此感到困惑 .

BTW我的Web服务是在IIS7中使用.Net4.5框架和MVC4 WebApi .

我的代码有点像这样:所以我想异步调用SendSms部分 . 我怎么做?我可以简单地使用Task.Run Async和Await吗?

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;
    }

1 回答

  • 0

    Twilio福音传教士在这里 .

    好的,所以你有一个Web API方法,在其中调用可能长时间运行的WCF方法 . 这里有两个问题需要解决:

    • 如何以不阻止Web API方法返回响应的方式调用WCF方法

    • 如何让Twilio等到WCF方法完成

    我前一段时间写了一篇blog post,它通过在Twilios <Play>动词上利用.NET的Task Parallel libraryloop属性向您展示如何在IVR中创建一个无限期的等待循环 .

    帖子的要点是你可以使用TPL的StartNew方法在新线程上启动长时间运行的WCF方法 . 这允许ASP.NET继续并允许您返回一些TwiML,因此Twilio不会结束调用 . 然后将它与continuation配对,它可以让您知道WCF服务请求何时完成,并且您可以使用REST API向Twilio发送回一个新的TwiML指令集 .

    希望有所帮助 .

相关问题