【发布时间】:2017-01-17 14:01:55
【问题描述】:
我正在寻找一种在 web api 2 中创建一组通用方法的方法,我可以将其与 http 客户端一起使用以连接到另一台服务器。
首先,解释一下我的基础架构。我公司通常采用的简化设置(省略数据库服务器和其他东西)由两个主要服务器组成。有一个 Web 层服务器用于托管应用和网站,还有一个应用层服务器包含服务/api 等。
内部规则规定,位于 Web 服务器上的应用程序不能直接与应用程序服务器上的任何内容通信,除非先通过代理或代理服务。
我目前对这个问题的解决方案是创建一个 SDK web api 服务,其中包含 api 中所有路由的副本。应用程序(在本例中为 Angular 应用程序)通过 REST api 调用调用此 SDK 服务,而此中间服务的工作是使用 .NET HttpClient 将此调用转换为对在其上运行的“实际”api 服务的调用另一台服务器。
这很好用,到目前为止我没有遇到任何问题,但我觉得可能有更好的方法来做这类事情。我在网上搜索过描述这种事情的文章,但都没有找到,而且我绝不是使用 .NET 或 web api 的专家。
我将举例说明我刚才的解决方案 - 调用以获取当前存储在我的数据库中的所有客户端。
public class ClientsController: ApiController
{
// http client used to translate calls to api service
private HttpClient httpClient = new HttpClient()
{
BaseAddress = new Uri(ConfigurationManager.AppSettings["apiUrl"])
};
[Route("clients")]
[HttpGet]
public IHttpActionResult GetClients()
{
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json");
List<Client> clients = null;
try
{
HttpResponseMessage result = httpClient.GetAsync("clients").Result;
if (result.IsSuccessStatusCode)
{
clients = result.Content.ReadAsAsync<List<Client>>().Result;
return Content(result.StatusCode, clients);
}
// return the failed reason code
return Content(result.StatusCode, result.ReasonPhrase);
}
catch (Exception e)
{
return Content(HttpStatusCode.InternalServerError, e.Message);
}
}
}
然后在我的 api 服务中实现此路由,该服务在另一台服务器上运行,并从数据库中检索客户端,将该客户端列表返回给该服务,然后返回到我的应用程序以显示在屏幕上。
API 中的每个路由都存在一对方法(如上所示的一个加上实际实现)。
理想情况下,我希望我的 sdk 服务为每个 HTTP 动词包含一个方法,其中它采用传递给它的路由,从 api 服务调用该路由并处理返回的项目或结果代码它,类似于它现在所做的,除了我可以向 api 添加一组新的端点,而不必在两个地方添加它们。
这就是我卡住的地方。对如何做到这一点或我可能没有探索过的任何替代方案的任何见解都会很棒。
感谢您花时间阅读这个长问题。
【问题讨论】:
-
所以,如果简单点——您有 2 个 Web API 服务器,其中 1 个是真实服务器,另一个是更严格的中介,将传入请求重定向到真实服务器?对吗?
-
@Vladimir 是的,没错
标签: c# .net asp.net-web-api