У меня есть несколько служб WCF REST в Azure. Внутри некоторых служб WCF я вызываю запросы Http (скажем, для отправки электронной почты / смс) во внешние службы. http-запросы к сторонним сервисам, которые не являются критичными . Я не хочу, чтобы это блокировало мой ответ на вызов клиента. Нужно некоторое руководство по шаблону, который будет использоваться в этом случае. Это для пожарной и забыть шаблон в моем сервисе wcf.
Псевдокод для службы WCF
[WebInvoke(UriTemplate = "process", Method = "POST")]
[OperationContract]
public bool DoSomeProcessing(DataEntity data)
{
bool result = ProcessData(data);
//I do not want this call to block
SendSMS();
}
//Call to third party
public void SendSMS()
{
HttpWebRequest objWebRequest = null;
HttpWebResponse objWebResponse = null;
objWebRequest = (HttpWebRequest)WebRequest.Create(url);
objWebRequest.Method = "GET";
//I do not want to wait for this response since often the web requests takes a bit of time.
//objWebResponse = (HttpWebResponse)objWebRequest.GetResponse();
}
Все мои контекстные режимы экземпляра wcf-служб настроены на PerCall.
InstanceContextMode = InstanceContextMode.PerCall
Некоторые службы отправляют электронную почту и SMS. Я не хочу, чтобы эти сервисы блокировались до тех пор, пока не будут возвращены SMS.
Я прочитал литературу, и три метода выделились
Запустить и забыть, используя ThreadPool.QueueUserWorkItem - я видел некоторые ограничения на количество потоков, плюс если все мои вызовы wcf являются PerCall, будет ли QueueUserWorkItem безопасным?
Иметь отдельную службу REST WCF с включенной опцией oneway для функции SendSMS, которая, в свою очередь, делает веб-запрос к внешним службам (хотя это выглядит как хак).
Использовать BeginInvoke без EndInvoke
Наконец, есть что-то конкретное в Azure, которое мне не хватает. Любые указатели в правильном направлении будут оценены.