Целью приведенного ниже метода является асинхронная настройка и запуск сообщения http из приложения для настольных компьютеров в веб-контроллер. Я думаю, что проблема в том, как мы настраиваем задачу ниже, и я считаю, что в .NET 4.5 есть лучшие методы, такие как async/await и Task.Run, которые будут решать проблему, но обновление в настоящее время не является вариант. Есть ли лучший способ обработать/записать это в .NET 4.0, чтобы предотвратить описанные ниже проблемы?PostAsync() в рамках задачи в .NET 4.0, вызывающей WebException
public void PostWithoutResponse(object objectToPost, string url) {
Task.Factory.StartNew(() =>
{
using (var handler = new HttpClientHandler()) {
handler.PreAuthenticate = true;
handler.Credentials = _credentialPool.GetNetworkCredentials(new Uri(url));
using (var client = new HttpClient(handler)) {
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
using (var stringContent = new StringContent(JsonConvert.SerializeObject(objectToPost), Encoding.UTF8, "application/json")) {
// We weren't able to get this post to work without waiting for result
var result = client.PostAsync(url, stringContent).Result;
}
}
}
});
}
Этот метод иногда будет работать только в 2-3 раза, а иногда и несколько, а иногда даже работает на сотни постов - несколько партий - до неудачу. Программа продолжается, но никакие дальнейшие сообщения не отражаются в базе данных, и в итоге создается исключение. (. Возможно, из-за тайм-аута)
Мы имели возможность наблюдать это исключение бросают:
System.AggregateException was unhandled
Message: An unhandled exception of type 'System.AggregateException' occurred in mscorlib.dll
Additional information: One or more errors occurred.
С одним внутренним исключением:
_innerException {"The request was canceled"} System.Exception {System.Net.WebException}
Интересно, что хотя обновления базы данных остановки после 2-3, программа (рабочий процесс автоматической обработки партии) продолжает работать, и исключение, похоже, не выбрасывается до тех пор, пока этот метод не будет достигнут для получения новой партии. Возможно, связано?
public string GetPostResult(object objectToPost, string url) {
string jsonResult = null;
using (var handler = new HttpClientHandler()) {
handler.PreAuthenticate = true;
handler.Credentials = _credentialPool.GetNetworkCredentials(new Uri(url));
using (var client = new HttpClient(handler)) {
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var serializedContent = JsonConvert.SerializeObject(objectToPost);
using (var stringContent = new StringContent(serializedContent, Encoding.UTF8, "application/json")) {
var taskResult = client.PostAsync(url, stringContent).Result;
jsonResult = taskResult.Content.ReadAsStringAsync().Result;
}
}
}
return jsonResult;
}
Кроме того, я должен отметить, что мы пытались положить Try/улов в несколько соглашений, но не могу показаться, чтобы захватить это исключение в любом месте до тех пор, пока пузырьки, и ломает выполнения.
(Изначально казалось, что приведенный выше код работает на наших компьютерах развития, а при отсутствии на производственных машинах, но оказывается, были случайные удачи в сочетании с непониманием с нашей стороны.)
Похоже, что вы можете слишком быстро нанести удар по серверу и ограничить скорость. –
Оцените эту мысль, но не объясните, почему она работает отлично на наших машинах с той же скоростью. – RJB
@RJB, поскольку IIS, установленный на ваших компьютерах, не имеет ограничения скорости? –