我正在制作Razor Pages应用程序,并且正在使用HttpClient
向PageModel
发出对某些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
没关系,我的项目已关闭。仍然感谢您的帮助!
答案 0 :(得分:1)
对于HttpClient
,您无法在HttpClient
内部进行重定向。您只能在PageModel
中重定向。
要解决此问题,您可以尝试将Exception
扔到ApiClient.PostAsync
中,然后使用app.UseExceptionHandler("/Error");
重定向到错误页面。
定义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);
}
}
注册ApiClient
services.AddScoped<ApiClient>();
从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/");
}
从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。