C# Веб-метод: обеспечить ответ в течение срока? - PullRequest
0 голосов
/ 01 марта 2020

Мой веб-сервис выглядит так:

[WebMethod]
public clsReponse MyWS(string a, string b, string c) {
  clsReponse reply = doSth( a, b, c );
  return reply;
}

public clsReponse doSth(string a, string b, string c) {
  // Call other web service and hard disk I/O (i.e. write log files)
}

public class clsReponse() {
  public bool success { get; set; }
  public string msg { get; set; }
}

Я знаю, что клиентский вызов MyWS установил 60-секундный тайм-аут, но я хочу ответить в течение 30 секунд. Если doSth() не выполнил свою работу в течение 30 секунд, я сначала хочу ответить клиенту, позволяя ему завершить sh свою работу.

Я подумываю установить таймер в MyWS(), изменив doSth() на async метод. Но во-первых, я не уверен, означает ли это, что у каждого запроса будет свой таймер?
Во-вторых, я искал inte rnet, и кажется, что async / await не следует использовать в веб-методах?

Я так растерялся. Есть ли лучший способ сделать это?


Спасибо за редактирование и комментарии!
Я ожидаю ответить на сообщение типа "Слишком долго" клиенту, но я не готов для второй конечной точки. Сейчас я просто хочу записать процесс doSth() в файл журнала. Поэтому, когда метод завершен, ничего не выводится.


Это может быть ответом:

[WebMethod]
public clsReponse MyWS(string a, string b, string c) {
  float m_state = 0;
  clsReponse reply = null;
  Task task = Task.Run( () => { reply = doSth( a, b, c ); } );
  do {
    if( task.IsCompleted )
    return reply;
    m_state += (float)1000 / 1000;
    Thread.Sleep( 1000 );
  } while( m_state < 30 );
  return reply = new clsReponse(){ success = false; msg = "Timeout." };
}

Пожалуйста, ответьте, если есть лучший способ сделать это. Спасибо.

...