如何将错误从ASP.Net Razor页面中的API自动重定向到错误页面?

时间:2018-08-07 13:00:27

标签: c# razor asp.net-core razor-pages

我正在制作Razor Pages应用程序,并且正在使用HttpClientPageModel发出对某些API的请求。 (ApiClient基本上是从HttpClient

派生的类
  public class IndexModel : MyPageModel {
    public IndexModel(ApiClient client) : base(client) { }

    public void OnGet() {
      var response = _client.PostAsync("account/login", new StringContent("")).Result;
      var status = response.StatusCode; // If status == BadRequest, redirect to Error.html
    }
  }
}

如果从API收到 400 BadRequest 或其他错误,如何设置自动重定向? 还是在发送请求时需要每次检查?

我知道,我可以使用Redirect之类的东西,但是我想使其自动化。

@EDIT

没关系,我的项目已关闭。仍然感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

对于HttpClient,您无法在HttpClient内部进行重定向。您只能在PageModel中重定向。

要解决此问题,您可以尝试将Exception扔到ApiClient.PostAsync中,然后使用app.UseExceptionHandler("/Error");重定向到错误页面。

  1. 定义ApiClient

    public class ApiClient : HttpClient
    {
    public Func<HttpResponseMessage, HttpResponseMessage> Action => (response) =>
    {
        if (response.StatusCode != System.Net.HttpStatusCode.OK)
        {
            throw new Exception(response.ToString());
        }
        return response;
    };
    public async Task<HttpResponseMessage> GetAsync(string requestUri)
    {
        var result = await base.GetAsync(requestUri);
        return Action(result);
    }
    
    }
    
  2. 注册ApiClient

        services.AddScoped<ApiClient>();
    
  3. PageModel拨打电话

     public class IndexModel : PageModel
    {
    private readonly ApiClient _apiClient;
    public IndexModel(ApiClient apiClient)
    {
        _apiClient = apiClient;
    }
    public async Task OnGet()
    {
        var result3 = await _apiClient.GetAsync("https://www.baidu.com/");
    }
    
  4. HttpClient开始执行所需的方法,例如PostAsync

答案 1 :(得分:0)

除了Ok(200),您可以对所有响应代码进行类似处理。

public void OnGet() {
      var response = _client.PostAsync("account/login", new StringContent("")).Result;
      var status = response.StatusCode;
      if(status != HttpStatusCode.OK){
          //redirect to error page
      }
    }

答案 2 :(得分:0)

它与Razor Pages不兼容,因为坦率地说API与Razor Pages并不真正兼容。但是,使用实际的控制器(和ASP.NET Core 2.1+),可以使用[ApiController]属性来装饰它。然后,ASP.NET Core将自动返回400,其中ModelState无效时将ModelState转换为JSON。