c# - Asp.net Web Api 重定向请求

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

我有一个 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}&param2={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 调用某些内部服务时。您有以下选择:

  1. 将内部服务作为类方法调用
  2. 对服务调用进行服务
  3. 设置消息队列或总线,您的 API 将通过服务总线与其进行通信。

将您的内部服务作为类方法调用 好简单。服务调用不会受到影响和延迟。但是您应该引用程序集,但这并不总是可能的。或者由于要求这样的方式是不可能的

调用服务电话 缺点:您的服务紧密耦合,有延迟,应该等待内部服务的响应。这被认为是不好的做法。但作为服务总线的第一步,这可能是一个很好的临时解决方案。

设置消息队列或总线,您的 API 将通过服务总线与之通信。 您的服务是解耦且独立的。您不应该等待回复。但从技术上来说,设置起来更困难,并使您的架构和基础设施更加复杂/

作为摘要 对于您的架构,没有现成的最佳方法,您应该根据您的要求从替代方案中进行选择。

关于c# - Asp.net Web Api 重定向请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16295597/

相关文章:

c# - 在单元测试中为 ApiController 设置用户属性

asp.net-web-api - 为什么 web api(RestFul) .Net Core 服务不接受参数中的正斜杠,如何解决此问题

api - 如何验证每个用户可以使用 OAuth 和 OpenID Connect 访问哪些资源?

c# - 如何记录 Azure 移动服务后端

c# - 使用语句和 Entity Framework 实体

c# - 如何将枚举值设置为 Web 用户控件的自定义属性?

c# - 如何获取正在访问 ASP.NET 应用程序的当前用户?

c# - 未初始化变量的不正确编译器错误使用

c# - 为 Winform 创建复选框

asp.net - Repeater 控件中的水平方向