如何正确使用包装为类库的HttpClient

时间:2016-08-25 18:12:20

标签: c# asp.net-web-api class-library

在我的C#应用​​程序中,我需要有两个不同的部分:
1)包装HttpClient的类库,将URI和JSON对象等参数作为POSTED,并在HttpClient的实例上调用POST方法:

static async Task CreateCustomer()
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://10.211.55.2:8080/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Add("Accept", "application/json");

                var customer = new Customer() { Name = "Gizmo",  Address = "123 Widget lane" };
                var response = await client.PostAsJsonAsync("/api/customer", customer);
                var p = response;
            }
        }

2)Windows控制台应用程序,它导入此类库,并调用此CreateCustomer方法,传递URI和Customer JSON对象的实际参数值:

static async Task EnvokeCreateCustomer()
        {
            Customer customer = new Customer {Name="",Address="" };
            var URI = "http://my_api:8080/Customer";
            RestClient.Client restClient = new RestClient.Client();
            restClient.CreateCustomer(URI, customer);
        }

此代码运行,但不是事件命中我的API,正确传递它,并且什么都不做。与GET API相同的问题。

是否有一种经过验证的方法可以创建这样的类库,可以通过控制台应用程序调用它?

1 个答案:

答案 0 :(得分:1)

您没有等待方法调用:

await restClient.CreateCustomer(URI, customer);

根据应用程序主机的不同,这可能会或可能不会产生明显的差异。在控制台应用程序中,应用程序可以简单地执行其操作并立即终止,这会产生巨大的差异。

更不用说如果不等待通话,过程中收到的任何错误都可能完全被忽视。所以可能存在问题并且它试图告诉你问题是什么,但你的代码却忽略了它。

当然有编制警告指出这一点。永远不要忽略编译器警告。

旁注:这段代码甚至可以编译?这样:

restClient.CreateCustomer(URI, customer);

不能称之为:

static async Task CreateCustomer()

如果您向我们展示的内容不是您的实际代码,那么就答案而言,所有投注都会被取消。