Asp.net Web Api 重定向请求

Posted

技术标签:

【中文标题】Asp.net Web Api 重定向请求【英文标题】:Asp.net Web Api Redirect request 【发布时间】:2013-04-30 08:40:46 【问题描述】:

我有一个 Asp.net Web API 项目,它有几个 CRUD 方法。

在这些方法之上,我想添加一个读取Authorization 标头的授权服务并阻止用户访问资源(如果他们没有被授权)。

// 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) 对象吗?

【问题讨论】:

InternalControllerExternalController 在同一个 Web 项目上吗? 不,它们是不同的项目 【参考方案1】:

谈到 ASP.NET Web API 时。 HttpClient 不会自动重定向您。当您成为内部服务的响应时,您可以将其传递给外部。或者您可以重定向您的操作,例如 here

要从 REST 的角度为客户端正确重定向,请使用 HTTP 重定向标头和响应代码。例如HTTP response code 302。然后客户端应该能够对此类响应代码做出反应并从 Location 标头中获取重定向地址。但它是关于客户端重定向的。

谈到从架构调用 API 中的某些内部服务时。您有以下选择:

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

将您的内部服务调用为类方法 很容易。服务呼叫没有影响和延迟。但是您应该参考程序集,但这并不总是可能的。或者由于要求,这种方式可能是不可能的

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

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

作为总结 对于您的架构,没有现成可用的最佳方法,您应该根据自己的要求从备选方案中进行选择。

【讨论】:

非常全面的答案!我想我会使用 Service 类,也是因为我可以引用我需要的程序集。【参考方案2】:

这是将数据发布到 web api 的示例代码:-

    var handler = new HttpClientHandler UseDefaultCredentials = true;
        using (var client = new HttpClient(handler))
           
            client.BaseAddress = new Uri("https://IE url.com");  
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var  postDataObject = new
                
                    SCName = properties.Site.PortalName,
                    TotalSites = properties.Web.Webs.Count
     ;

    var jsonPostData = new javascriptSerializer().Serialize(postDataObject);
                HttpContent content = new StringContent(jsonPostData, System.Text.Encoding.UTF8, "application/json");
                HttpResponseMessage response = client.PostAsync("/controllerclassname/InsertUpdateDataOperation", content).Result;
                if (response.IsSuccessStatusCode)
                
        //Check the response here
                  //  var webApiResponse = response.Content.ReadAsStringAsync().Result;                    
                   

【讨论】:

以上是关于Asp.net Web Api 重定向请求的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Web API + Angular 对预检请求的响应未通过访问控制检查:预检请求不允许重定向

从 asp.net web api 发布操作重定向

ASP.NET Web API 2 Bearer Token 重定向到登录页面而不是返回 401

禁止在 ASP.NET Core 中对 API URL 进行重定向

ASP.NET Web APP 和 Web API 无限重定向循环中的 Azure AD Open ID Connect OAuth 2.0

ASP.NET Core 3.1 和 Angular:将 api 调用重定向到登录页面