[英]How to call a WCF method asynchronously from MVC4 WebAPI
我是WebApi,.Net领域的新手,对所有可用信息都感到困惑,我应该采取哪种方法。 我已经使用MVC4 WebApi创建了一个WebService,当收到文本消息时Twilio会调用它。 我需要回复此短信。 我正在使用WCF方法,该方法当前正在同步调用。 由于我的过程可能需要超过3-5秒的时间来处理对文本消息的答复,因此与Twilio的连接由于超时而断开了连接。 因此,我正在寻找异步调用此WCF方法的方法。 我的问题是调用WCF方法(我正在使用对象工厂来调用WCF并使用)我是否需要更新合同以说“异步”? 我对此一点困惑。
顺便说一句,我的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;
}
Twilio的传播者在这里。
好的,因此您有一个Web API方法,在其中调用可能长期运行的WCF方法。 这里有两个问题要解决:
不久前,我写了一篇博客文章 ,向您展示如何利用.NET的Task Parallel库和Twilios <Play>
动词上的loop属性在IVR中创建不确定的等待循环。
该帖子的要旨是,您可以使用TPL的StartNew方法在新线程上启动长期运行的WCF方法。 这使ASP.NET可以继续,并允许您返回一些TwiML,因此Twilio不会结束呼叫。 然后,将其与一个延续配对,让您知道WCF服务请求何时完成,并且可以使用REST API信号回Twilio,以将正在进行的调用重定向到一组新的TwiML指令。
希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.