我有一个 Asp.net Web API 项目,其中有多个 CRUD 方法。
除了这些方法之外,我想添加一个授权服务,该服务读取 Authorization
header 并阻止用户访问资源(如果未经授权)。
// Method on internal IP Project
public class InternalController : ApiController
{
public void Create(CreateRequest request)
{
// implement the method
}
}
// Method on public IP Project
public class ExternalController : ApiController
{
public async Task Create(CreateRequest request)
{
// validate Authorization header and throw exception if not valid
using (HttpClient client = new HttpClient())
{
string parameters = string.Format("param1={0}¶m2={1}", request.Param1, request.Param2);
client.BaseAddress = new Uri("http://192.168.1.1/");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.GetAsync("api/internal/create?" + parameters);
response.EnsureSuccessStatusCode();
}
}
}
是否有任何方法可以更轻松地将请求从外部 API“重定向”到内部 API?
现在,我必须手动重新创建在ExternalAPI中收到的所有参数并在InternalAPI中发送它们,即使它们是相同的。
我可以让HttpClient
自动发送我在ExternalAPI方法中拥有的HttpRequestMessage(Request)
对象吗?
最佳答案
当谈到 ASP.NET Web API 时。 HttpClient 不会自动重定向您。当您获得内部服务的响应时,您可以将其传递给外部。或者您可以重定向您的操作,例如 here
为了从 REST 角度正确重定向客户端,请使用 HTTP 重定向 header 和响应代码。例如HTTP response code 302 。然后客户端应该能够对此类响应代码使用react并从 Location header 获取重定向地址。但这是关于客户端的重定向。
当谈论从架构中的 API 调用某些内部服务时。您有以下选择:
- 将内部服务作为类方法调用
- 对服务调用进行服务
- 设置消息队列或总线,您的 API 将通过服务总线与其进行通信。
将您的内部服务作为类方法调用 好简单。服务调用不会受到影响和延迟。但是您应该引用程序集,但这并不总是可能的。或者由于要求这样的方式是不可能的
调用服务电话 缺点:您的服务紧密耦合,有延迟,应该等待内部服务的响应。这被认为是不好的做法。但作为服务总线的第一步,这可能是一个很好的临时解决方案。
设置消息队列或总线,您的 API 将通过服务总线与之通信。 您的服务是解耦且独立的。您不应该等待回复。但从技术上来说,设置起来更困难,并使您的架构和基础设施更加复杂/
作为摘要 对于您的架构,没有现成的最佳方法,您应该根据您的要求从替代方案中进行选择。
关于c# - Asp.net Web Api 重定向请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16295597/