Я пытаюсь сделать асинхронный/ожидающий Web API Post в Global.asax, чтобы не блокировать приложение при загрузке при выполнении Rest-api-post.
Но приложение никогда не запускается, и все будет работать быстрее, если вы не сделаете это асинхронно. Что я здесь делаю неправильно?
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
protected void Session_Start(object sender, EventArgs e)
{
var somePostValue = myJsonString();
RunAsync(somePostValue).Wait();
}
private static async Task RunAsync(string postValue)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:56789/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.PostAsJsonAsync("api/MyApi", postValue);
}
}
}
Вы захотите зарегистрировать методы * Async() с соответствующими обратными вызовами HttpApplication
AddOn*()
. Это позволяет избежать взаимоблокировок (что я был бы удивлен, если бы у вас их не было). Более подробный ответ здесь: qaru.site/questions/9580477/...
AddOn*Async
все по запросу. Нет метода AddOnApplicationStartupAsync
.
Поскольку это не похоже на то, что вы делаете что-либо с ответом, вместо того, чтобы ждать задания,
RunAsync(somePostValue).Wait();
вы можете стрелять и забыть это так:
Task.Factory.StartNew(() => RunAsync(somePostValue));
RunAsync(somePostValue)
достаточно для RunAsync(somePostValue)
и забыть