Держите ваши запросы к другим системам скрытыми за шлюзом и храните там все мрачные подробности о внешнем API. Также рекомендуется использовать по одному HttpClient для каждого приложения, потому что у них есть недостаток дизайна, который сохраняется на сокетах после их утилизации.
Если вы используете ядро dotnet, используйте HttpClientFactory, чтобы получить экземпляр пула HttpClient
Для создания HttpClient в вашем Global.asax
public class MvcApplication : System.Web.HttpApplication
{
public static HttpClient HttpClient { get; set; }
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
HttpClient = new HttpClient();
}
protected void Application_End()
{
if (HttpClient == null) return;
HttpClient.Dispose();
}
}
Наивной реализацией может быть
public class ExternalGateway
{
private readonly HttpClient _httpClient;
public ExternalGateway(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<SomeModel> GetSomeExternalResource(Uri uri)
{
var response = await _httpClient.GetAsync(uri.AbsoluteUri);
// TODO: check status
// do some conversion of the content to your model
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<SomeModel>(content);
}
}
public class SomeModel
{
public string SomeProperty { get; set; }
}
заменяет вашу модель и URL, к которому вы хотите подключиться.
Тогда ваш контроллер может оставаться чистым.
что-то вроде
var gateway = new ExternalGateway(MvcApplication.HttpClient);
var model = await gateway.GetSomeExternalResource(new Uri("<your complete url>"));
return View(model);
Это предполагает, что вы собираетесь использовать строго типизированную модель с вашим представлением вместо ViewBag.