2008-09-25 4 views
1

Нам нужно будет обратиться к третьему лицу, чтобы получить значение с помощью REST, однако если мы не получим ответ в течение 10 мс, я хочу использовать значение по умолчанию и продолжить обработка.Выполнение строгой политики тайм-аута на стороне сервера webrequest

Я склоняюсь к использованию асинхронного WebRequest для этого, но мне было интересно, есть ли уловка для этого, используя синхронный запрос.

Любые советы?

+0

Когда дело доходит до веб-запросов, 10 мс * действительно * не так долго, вы можете обнаружить, что чаще всего это не так, вы просто используете настройку по умолчанию, хотя в теории кеширование должно помочь здесь. В общем, этот вопрос состоит в том, чтобы сделать что-то асинхронно с тайм-аутом. – thecoshman

ответ

2

Если вы делаете запрос и ожидаете его возвращения, я бы сказал, что оставайтесь синхронными - нет причин для выполнения асинхронного запроса, если вы ничего не сделаете или не будете реагировать во время ожидания.

Для синхронизации вызова:

WebRequest request = WebRequest.Create("http://something.somewhere/url"); 
WebResponse response = null; 
request.Timeout = 10000; // 10 second timeout 
try 
{ 
    response = request.GetResponse(); 
} 
catch(WebException e) 
{ 
    if(e.Status == WebExceptionStatus.Timeout) 
    { 
    //something 
    } 
} 

Если делать асинхронный:

не

Вы должны вызвать Abort() объект запроса - вам необходимо проверить время ожидания самостоятельно, там нет встроенного - чтобы обеспечить жесткий тайм-аут.

+0

Не будет асинхронным, чтобы процессор мог остановиться, пока он ждал обратного вызова? Возможно, нет, но это то, что я сделал со службой, которую я написал. Он называет веб-сайт каждые 30 секунд, но он делает это асинхронно. Если до истечения последнего запроса закончится 30 секунд, он снова заснет. –

+0

Хотя веб-службы .NET, по крайней мере, синхронные вызовы действительно асинхронны под капотом в любом случае. – MusiGenesis

0

Вы можете инкапсулировать ваш вызов третьей стороне в WebService. Затем вы можете вызвать этот WebService синхронно с вашим приложением - ссылка на веб-службу имеет простое свойство таймаута, которое вы можете установить на 10 секунд или что-то еще.

Ваш звонок, чтобы получить сторонние данные из вашего WebService, выкинет WebException после истечения периода ожидания. Вы поймаете его и используете значение по умолчанию.

EDIT: ответ Филиппа выше лучше. РИФ.

Смежные вопросы