我想我可能会迟钝,或者我要求C#过多,但我无法让它发挥作用。
我本来要做的就是用一些日志记录功能包装API客户端,以及从API服务器请求新令牌的方法。
控制器:
public class TestController : ApiController
{
[HttpGet]
[Route("api/model/get/{id}"]
public IHttpActionResult GetModel<Model>(int id)
{
var result = Service.DoHttp<Model>(ServiceClass.GetModel, id);
}
}
服务
public static class ServiceClass
{
private static readonly HttpClient client = new HttpClient() { BaseAddress = new Uri(Globals.ExternalApiPath) };
private static string TokenHeader = "";
public async static Task<HttpResponseMessage> GetModel(int id)
{
var response = client.GetAsync($"/api/get/{id}");
return await response;
}
public static T DoHttp<T>(Func<int, HttpResponseMessage> funk, int id)
{
try
{
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", TokenHeader);
var result = funk(id);
if (result.IsSuccessStatusCode)
{
return result.Content.ReadAsAsync<T>().Result;
}
else
{
throw new Exception(String.Format($"Unknown error! Unable to contact remote API! AccessToken: {TokenHeader} Status code: {result.StatusCode}"));
}
}
catch (Exception e)
{
// log ex
throw e;
}
}
}
但我的 Service.DoHttp(Service.GetModel,id); 抱怨它是错误的返回类型。
我做错了什么或者我误解了整个概念?
编辑:编译器抱怨'Task ServiceClass.GetModel(int)'的返回类型错误
答案 0 :(得分:3)
将DoHttp
方法更改为以下内容。
public static T DoHttp<T>(Func<int, Task<HttpResponseMessage>> funk, int id)
当GetModel
方法返回Task
时,您需要使用任务作为Func
的返回类型。