如何使用.net core设计一个调用statefull api的Web项目

问题描述 投票:0回答:2

需要输入来设计 Web 应用程序。该场景描述如下。

想要使用 .net core 开发一个 Web 应用程序,该 Web 应用程序将只有表示层,这意味着该 Web 应用程序将使用我们无法控制的第三方 API。

第三个第三方 API 是有状态 API,它作为具有粘性会话的负载均衡器后面的网络场运行。

我们要构建的 Web 应用程序只需调用第三方 API 来获取数据。身份验证也将由第三方 API 管理。

我们将构建的表示层(Web 应用程序)将仅根据用户操作调用第三方 API。用户可以单击按钮或执行任何需要调用几个第三方 API 的操作,然后将响应合并到一个视图模型中并将其传递到浏览器。

想了解,由于身份验证和会话管理是通过当事人 API 层的 cookie 完成的,我们是否需要进行任何会话管理,或者只是在视图模型中发回响应就可以了?

就像身份验证后一样,我们从 API 的响应中提取标头,通过表示层中的响应传递给客户端,之后对于每个请求,我们提取浏览器发送的标头并将其传递给 API 调用,然后从第三方 API 给出的响应并将标头传递给客户端浏览器。

如果我们也将应用程序作为网络场托管在多个服务器中,我们是否也需要为我们的 Web 应用程序提供粘性会话,因为第三方 API 是有状态的?

.net asp.net-mvc asp.net-core session-cookies sticky-session
2个回答
0
投票

您不必担心会话管理,因为身份验证和授权是由第三个 aprty API 处理的。您只需从响应中提取标头并将其添加到下一个请求中。

问候服务器场,您不必维护粘性会话。


0
投票

想了解身份验证和会话管理 是通过当事人 API 层的 cookies 完成的,我们需要做什么 会话管理或只是在我们的视图模型中发回响应 会起作用吗?

如果认证和会话管理由第三方 API 通过 cookie 处理,那么 .NET Core Web 应用程序可能不需要管理自己的会话状态。 第三方 API 负责通过其设置的 cookie 管理用户的会话,您的应用程序只需在客户端和 API 之间来回传递这些 cookie 即可。

但是,当该场景中每个后续用户请求有任何后续请求时,您的 .NET Core 应用程序会在请求中包含与身份验证相关的 cookie。 第三方 API 使用这些 cookie 来识别和验证用户。

如果我们也将应用程序作为网络场托管在多个服务器中,我们是否可以 我们的 Web 应用程序也需要有一个粘性会话,因为 第三方API是有状态的吗?

如果第三方API通过cookie管理用户的会话,您的应用程序不需要维护自己的会话状态。 客户端的每个请求都以 cookie 的形式携带必要的会话信息。

除此之外,由于第三方 API 是有状态的并且可能使用粘性会话,因此使网络场的行为与第三方 API 的期望保持一致非常重要。 所以基本上你不需要自己管理它们。

让我们在实践中看看,您应该如何在应用程序代码中处理这种情况:

您的演示应用程序视图模型:

public class ApiResponseViewModel
{
    public string Data { get; set; }
    public string ErrorMessage { get; set; }
}

第三方API服务:

public class ThirdPartyApiService
    {
        private readonly HttpClient _httpClient;
    
        public ThirdPartyApiService(HttpClient httpClient)
        {
            _httpClient = httpClient;
        }
    
        public async Task<ApiResponseViewModel> MakeThirdPartyApiCall(string apiUrl, Dictionary<string, string> authenticationHeaders)
        {
            
            foreach (var header in authenticationHeaders)
            {
                _httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
            }
            var response = await _httpClient.GetAsync(apiUrl);
    
            var apiResponseViewModel = new ApiResponseViewModel();
    
            if (response.IsSuccessStatusCode)
            {
               
                apiResponseViewModel.Data = await response.Content.ReadAsStringAsync();
            }
            else
            {
              
                apiResponseViewModel.ErrorMessage = "API call failed";
            }
    
            return apiResponseViewModel;
        }

控制器用于调用您的端点:

public class ManageThirdPartyRequestController : Controller
{
    private readonly ThirdPartyApiService _apiService;

    public ManageThirdPartyRequestController(ThirdPartyApiService apiService)
    {
        _apiService = apiService;
    }

    public async Task<IActionResult> CallThirdPartyEndpoint()
    {
      
        var authenticationHeaders = Request.Headers
            .Where(h => h.Key.StartsWith("Your-Auth-Header-"))
            .ToDictionary(h => h.Key, h => h.Value.ToString());
        var apiResponse = await _apiService.MakeThirdPartyApiCall("https://third-party-api.com/data", authenticationHeaders);

        
        var viewModel = new ApiResponseViewModel
        {
            Data = apiResponse.Data,
            ErrorMessage = apiResponse.ErrorMessage
        };

        return View(viewModel);
    }
}

注意: 上述虚拟设计的目的是向您展示我们如何在实践中实现这一目标。请随意修改您的 ViewModel 和身份验证端点定义。唯一的目的是帮助您如何继续。另一个重要的一点是,如果您想在后续请求中保留用户凭据,则应该使用 cookie 来处理上述场景。如果您进一步遇到任何问题,请针对您的问题发布新问题。

© www.soinside.com 2019 - 2024. All rights reserved.