C#HttpClient无需等待响应即可发布信息

时间:2016-03-23 22:05:26

标签: c# .net asp.net-web-api asp.net-web-api2 dotnet-httpclient

我在我的asp.net web api 2应用程序中使用HttpClient类将一些信息发布到端点。我只是想在不等待回复的情况下发布信息。 这是正确的语法

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://localhost:9000/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    // HTTP POST
    var gizmo = new Product() { Name = "Gizmo", Price = 100, Category = "Widget" };
    var response = await client.PostAsJsonAsync("api/products", gizmo);
}

2 个答案:

答案 0 :(得分:3)

  

我只想在不等待回复的情况下发布信息

不等待WebAPI中的异步方法将导致运行时异常,因为AspNetSynchronizationContext知道任何触发的异步操作。如果它注意到在异步操作之前控制器操作完成,它将触发所述异常。有关详情,请参阅ASP.NET Controller: An asynchronous module or handler completed while an asynchronous operation was still pending

如果您想使用fire并忘记语义,如果您使用的是.NET 4.5.2及更高版本,则需要通过HostingEnvironment.QueueBackgroundWorkItem对委托进行排队。如果没有,您可以推荐使用BackgroundTaskManager

请记住,这种设计并不适合WebAPI。如果您经常触发此操作呼叫,它不会扩展。如果经常发生这种风格,请考虑使用更合适的内容,例如消息代理。

答案 1 :(得分:0)

要在ASP.NET中实现异步任务,请参阅以下示例语法:

    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            RegisterAsyncTask(new PageAsyncTask(LoadUrlContent));
        }
        catch {}
    }

    protected async Task LoadUrlContent()
    {
        try
        {
        // Add your code here, for example read the content using HttpClient:
        string _content = await ReadTextAsync(YourUrl, 10);
        }
        catch { throw; }
    }

另外,请在页面级设置<%@ Page ... Async="true" %>

以下示例代码段显示了HttpClient的使用(从LoadUrlContent()调用此示例函数:

protected async Task<string> ReadTextAsync(string Url, int TimeOutSec)
{
    try
    {
        using (HttpClient _client = new HttpClient() { Timeout = TimeSpan.FromSeconds(TimeOutSec) })
        {
            _client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/html"));
            using (HttpResponseMessage _responseMsg = await _client.GetAsync(Url))
            {
                using (HttpContent content = _responseMsg.Content)
                {
                    return await content.ReadAsStringAsync();
                }
            }
        }
    }
    catch { throw; }
}

您可以修改与您的特定任务相关的代码库。

希望这可能会有所帮助。