【发布时间】:2018-04-03 03:25:27
【问题描述】:
我有一个旧版本的 ASP.NET MVC 应用程序,它没有 Startup.cs。我想实现一种简洁的方式来拥有一个HttpClient,我将用于我对第三方的 API 调用。
这是我迄今为止根据我收到的关于这个问题的一些想法/建议所做的。问题是当我进行 API 调用时,它无处可去。我把它放在try catch 中,但我什至没有例外。 API 提供者告诉我他们没有看到搜索参数。
首先,我创建了这个HttpClientAccessor 用于延迟加载。
public static class HttpClientAccessor
{
public static Func<HttpClient> ValueFactory = () =>
{
var client = new HttpClient();
client.BaseAddress = new Uri("https://apiUrl.com");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.TryAddWithoutValidation("APIAccessToken", "token1");
client.DefaultRequestHeaders.TryAddWithoutValidation("UserToken", "token2");
return client;
};
private static Lazy<HttpClient> client = new Lazy<HttpClient>(ValueFactory);
public static HttpClient HttpClient
{
get { return client.Value; }
}
}
然后我创建了自己的 API 客户端,这样我就可以在一个地方拥有 API 调用函数,如下所示:
public class MyApiClient
{
public async Task GetSomeData()
{
var client = HttpClientAccessor.HttpClient;
try
{
var result = await client.GetStringAsync("somedata/search?text=test");
var output = JObject.Parse(result);
}
catch(Exception e)
{
var error = e.Message;
}
}
}
然后在我的 ASP.NET 控制器操作中,我这样做:
public class MyController : Controller
{
private static readonly MyApiClient _apiClient = new MyApiClient ();
public ActionResult ApiTest()
{
var data = _apiClient.GetSomeData().Wait();
}
}
知道我的错误在哪里吗?
更新: 这种简单的方法效果很好:
public class MyController : Controller
{
private static readonly HttpClient _client = new HttpClient();
public ActionResult ApiTest()
{
_client.BaseAddress = new Uri("https://apiUrl.com");
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_client.DefaultRequestHeaders.TryAddWithoutValidation("APIAccessToken", "token1");
_client.DefaultRequestHeaders.TryAddWithoutValidation("UserToken", "token2");
var response = _client.GetStringAsync("somedata/search?text=test").Result;
}
}
【问题讨论】:
-
没有理由拥有单例。
标签: c# asp.net asp.net-mvc asp.net-mvc-4