2014-01-22 29 views
0

我是WebApi,.Net世界的新手,對於我應該採取什麼方法提供的所有信息完全混淆。我使用MVC4 WebApi創建了一個WebService,Twilio在收到文本消息時調用它。我需要回復這條短信。我正在使用當前正在同步調用的WCF方法。由於我的進程可能需要超過3-5秒才能處理對文本消息的回覆,因此由於超時而與Twilio的連接斷開。所以我正在尋找方法來異步調用這個WCF方法。 我的問題是調用WCF方法(我使用Object Factory調用WCF並使用) 我需要更新合同以表示異步?我對此很困惑。如何從MVC4異步調用WCF方法WebAPI

順便說一句我的Web服務是在IIS7中,並使用.Net4.5框架和MVC4 WebApi。

我的代碼有點像這樣:所以我想異步調用SendSms部分。我怎麼做?我可以簡單地使用Task.Run異步和等待?

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

幾個澄清問題。您是否使用ASP.NET Web API或WCF創建您的服務?另外,你有沒有一種特定的方法可以在你的服務中調用,你知道它可能會長時間運行? –

+0

@DevinRader - 我正在使用ASP.NET Web API創建服務。但在我的HTTP後,我已經實現了一個駐留在WCF中的方法。 – Ditty

回答

0

Twilio evangelist here。

好的,所以你有一個Web API方法,你可以在其中調用一個可能長時間運行的WCF方法。有兩個問題要解決這裏:

  1. 如何調用WCF方法在不從返回響應
  2. 你怎麼Twilio等到WCF方法阻止網頁API方法的方法已完成

我寫了blog post前一陣子,告訴您如何通過利用.NET的Task Parallel library和Twilios <Play>動詞loop屬性來創建在IVR無限期等待循環。

該帖子的要點是,您可以使用TPL的StartNew方法在新線程上啓動長時間運行的WCF方法。這可以讓ASP.NET繼續並讓您返回一些TwiML,因此Twilio不會結束呼叫。然後將它與continuation配對,它可讓您知道WCF服務請求何時完成,並且您可以使用REST API將redirect the in-progress call發送給Twilio以發送一組新的TwiML指令。

希望有所幫助。

+0

不錯的博客文章。但是博客顯示了當呼叫者等待呼叫者回復時該如何處理。在我的情況下,這是一個短信。那麼,我可以返回什麼TwiML消息?另外請注意,我實際上不打算通過TwiML返回任何內容,但是我們將使用Twilio Rest API將消息作爲回覆發送出去,即傳出消息。這是因爲對於傳入的文本,可能有超過10個短消息作爲回覆發送,這是TwiML API中的限制。 – Ditty

+0

基本上我覺得我需要一些可以開火和忘記的東西,除非我們有另一種告訴twilio等待得到答覆的方式。我不知道我們可以使用其他什麼動詞。因爲我相信我們不能和Sms Verb一起使用重定向。 – Ditty

+0

啊,好的。那麼在這種情況下,你不可能通過純粹的TwiML響應來實現。但是,您可以通過稍微更改帖子中的代碼來完成此操作。首先,因爲這是一個SMS,我們正在談論你不需要從ASP.NET方法返回任何東西。其次,在Continuation中,不需要通過API修改調用,而需要使用REST API發送回覆短信。希望有所幫助。 –