C# 触发HttpClient的更简单的方法(可能没有任务)?

C# 触发HttpClient的更简单的方法(可能没有任务)?,c#,asp.net-web-api,.net-core,task,dotnet-httpclient,C#,Asp.net Web Api,.net Core,Task,Dotnet Httpclient,我正在开发一个应用程序,它将使用我自己的REST端点。我有一个ONWWebAPI项目。现在,我尝试构建将在该端点上运行的应用程序 基于MSDN教程,我制作了如下内容: class Program { public static HttpDataService http = new HttpDataService("authorization token here"); static void Main(string[] args) { Console.W

我正在开发一个应用程序,它将使用我自己的REST端点。我有一个ONWWebAPI项目。现在,我尝试构建将在该端点上运行的应用程序

基于MSDN教程,我制作了如下内容:

class Program
{
    public static HttpDataService http = new HttpDataService("authorization token here");

    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");

        RunAsync().GetAwaiter().GetResult();
    }

    static async Task RunAsync()
    {
        var data = await http.Get("Default");
    }
}
public class HttpDataService
{
    public HttpDataService(string token)
    {
        this.HttpClient = new HttpClient();
        this.HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    }

    private HttpClient HttpClient { get; set; }

    public async Task<object> Get(string controller)
    {
        object data;
        HttpResponseMessage response = await this.HttpClient.GetAsync(UrlService.BuildEndpoint(controller));

        if (response.IsSuccessStatusCode)
        {
            data = await response.Content.ReadAsAsync<object>();
            return data;
        }
        else
        {
            throw new Exception(); //todo
        }
    }
}
为了测试,我制作了控制台核心应用程序。主类如下所示:

class Program
{
    public static HttpDataService http = new HttpDataService("authorization token here");

    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");

        RunAsync().GetAwaiter().GetResult();
    }

    static async Task RunAsync()
    {
        var data = await http.Get("Default");
    }
}
public class HttpDataService
{
    public HttpDataService(string token)
    {
        this.HttpClient = new HttpClient();
        this.HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    }

    private HttpClient HttpClient { get; set; }

    public async Task<object> Get(string controller)
    {
        object data;
        HttpResponseMessage response = await this.HttpClient.GetAsync(UrlService.BuildEndpoint(controller));

        if (response.IsSuccessStatusCode)
        {
            data = await response.Content.ReadAsAsync<object>();
            return data;
        }
        else
        {
            throw new Exception(); //todo
        }
    }
}
我的主要Http类如下所示:

class Program
{
    public static HttpDataService http = new HttpDataService("authorization token here");

    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");

        RunAsync().GetAwaiter().GetResult();
    }

    static async Task RunAsync()
    {
        var data = await http.Get("Default");
    }
}
public class HttpDataService
{
    public HttpDataService(string token)
    {
        this.HttpClient = new HttpClient();
        this.HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    }

    private HttpClient HttpClient { get; set; }

    public async Task<object> Get(string controller)
    {
        object data;
        HttpResponseMessage response = await this.HttpClient.GetAsync(UrlService.BuildEndpoint(controller));

        if (response.IsSuccessStatusCode)
        {
            data = await response.Content.ReadAsAsync<object>();
            return data;
        }
        else
        {
            throw new Exception(); //todo
        }
    }
}
没有我以前写过的RunAsync方法

另外,控制台应用程序工作正常,我从WebApi项目的默认控制器获取值

编辑

这样看起来更方便用户:

static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");

        Task get = http.Get("default");

        RunAsync(get).GetAwaiter().GetResult();
    }

    static async Task RunAsync(Task endpoint)
    {
         await endpoint;
    }

但是,如何从端点获取它呢?

您的代码有两个问题。第一个是RunAsync方法返回任务,而HttpDataService.Get方法返回任务。要从端点获取结果,RunAsync应该返回Task。当您等待此任务时,您将得到一个包含结果的对象

对于.GetAwaiter.GetResult,有两个选项。首先,您可以创建一个静态异步任务MainAsync,在其中运行所有代码,并通过调用MainAsync.GetWaiter.GetResult从非同步主方法调用此方法。在C7.1之前,这是一条路要走

static void Main(string[] args)
{
    MainAsync(args).GetAwaiter().GetResult();
}

static async Task MainAsync(string[] args)
{
    // Run your async code here
}
如果使用C7.1,可以将主方法设为异步静态异步任务Mainstring[]args,并从中直接调用异步代码

static async Task Main(string[] args)
{
    // Run your async code here
}

您的代码有两个问题。第一个是RunAsync方法返回任务,而HttpDataService.Get方法返回任务。要从端点获取结果,RunAsync应该返回Task。当您等待此任务时,您将得到一个包含结果的对象

对于.GetAwaiter.GetResult,有两个选项。首先,您可以创建一个静态异步任务MainAsync,在其中运行所有代码,并通过调用MainAsync.GetWaiter.GetResult从非同步主方法调用此方法。在C7.1之前,这是一条路要走

static void Main(string[] args)
{
    MainAsync(args).GetAwaiter().GetResult();
}

static async Task MainAsync(string[] args)
{
    // Run your async code here
}
如果使用C7.1,可以将主方法设为异步静态异步任务Mainstring[]args,并从中直接调用异步代码

static async Task Main(string[] args)
{
    // Run your async code here
}

您可以使用助手类

公共静态类AsyncHelper { 私有静态只读TaskFactory _TaskFactory=new TaskFactoryCancellationToken。无, 任务创建选项。无, TaskContinuationOptions。无, TaskScheduler.Default; 公共静态TResult RunSyncFunc func =>\u任务工厂 .StartNewfunc 打开…的包装 盖特先生 .GetResult; 公共静态无效RunSyncFunc func =>\u任务工厂 .StartNewfunc 打开…的包装 盖特先生 .GetResult; } 允许您这样做:

静态异步任务RunAsyncTask终结点{ AsyncHelper.RunSync=>endpoint; }
请看这里和这里

您可以使用助手类

公共静态类AsyncHelper { 私有静态只读TaskFactory _TaskFactory=new TaskFactoryCancellationToken。无, 任务创建选项。无, TaskContinuationOptions。无, TaskScheduler.Default; 公共静态TResult RunSyncFunc func =>\u任务工厂 .StartNewfunc 打开…的包装 盖特先生 .GetResult; 公共静态无效RunSyncFunc func =>\u任务工厂 .StartNewfunc 打开…的包装 盖特先生 .GetResult; } 允许您这样做:

静态异步任务RunAsyncTask终结点{ AsyncHelper.RunSync=>endpoint; } 请看这里和这里

您应该使Main异步

注意:仅适用于现代c语言

static async Task Main(string[] args)
{
    var result = await http.Get("default");
}
您应该使Main异步

注意:仅适用于现代c语言

static async Task Main(string[] args)
{
    var result = await http.Get("default");
}

所以,如果我理解正确,您想去掉RunAsyncget.GetAwaiter.GetResult吗?确切地说,我想删除那个RunAsync.GetAwaiter。。。。线我想为它做个包装。例如,使另一个类RestService成为GET、POST等的公共方法,在这个Rest类中,我将触发HttpDataService方法。在RestService类中,我将包装RunAsync。不是很完美,但是会更优雅,更容易编写,或者说,因为有另一个库可以使用C语言中的api?所以,如果我理解正确,您想去掉RunAsyncget.GetAwaiter.GetResult吗?确切地说,我想删除那个RunAsync.GetAwaiter。。。。线我想为它做个包装。例如,使另一个类RestService成为GET、POST等的公共方法,在这个Rest类中,我将触发HttpDataService方法。在RestService类中,我将包装RunAsync。不是完美的,但会更优雅,更容易编写,或者说,因为C中还有另一个库可以使用api?我的控制台应用程序只是用于测试的沙盒。我的主要项目将是WPFSame去一个WPF项目。应用程序的入口点也是一个静态的Main方法。用c7
.1,您可以使用C 7.3使该方法异步,因为元组返回。所以,即使在wpf应用程序中,我也可以使一些方法异步,然后执行var result=http.Get;?是的,你绝对可以!如果我的答案是你的解决方案,请考虑在你所希望的答案中标记,你可以在这里检查我的第二个问题:我的控制台应用程序只是沙箱,用于测试。我的主要项目将是WPFSame去一个WPF项目。应用程序的入口点也是一个静态的Main方法。通过使用C7.1,您可以使该方法异步,正如我在使用C7.3的回答中所述,因为元组返回。所以,即使在wpf应用程序中,我也可以使一些方法异步,然后执行var result=http.Get;?是的,你绝对可以!如果我的答案是你的解决方案,请考虑在你所希望的答案中注明,你可以在这里检查我的第二个问题: