使用参数传递通用函数

时间:2017-06-28 09:57:52

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

我想我可能会迟钝,或者我要求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)'的返回类型错误

1 个答案:

答案 0 :(得分:3)

DoHttp方法更改为以下内容。

public static T DoHttp<T>(Func<int, Task<HttpResponseMessage>> funk, int id)

GetModel方法返回Task时,您需要使用任务作为Func的返回类型。