Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 客户端多api响应处理_C#_Asp.net Web Api_Asp.net Core Webapi_Blazor_Blazor Client Side - Fatal编程技术网

C# 客户端多api响应处理

C# 客户端多api响应处理,c#,asp.net-web-api,asp.net-core-webapi,blazor,blazor-client-side,C#,Asp.net Web Api,Asp.net Core Webapi,Blazor,Blazor Client Side,我的api有一个返回多种响应类型的方法:GetTokenResponse、ErrorResponse、ErrorResponse [HttpPost("token")] [ProducesResponseType(typeof(GetTokenResponse), (int)HttpStatusCode.OK)] [ProducesResponseType(typeof(ErrorsResponse), (int)HttpStatusCode.BadRequest)] [Pr

我的api有一个返回多种响应类型的方法:GetTokenResponseErrorResponseErrorResponse

[HttpPost("token")]
[ProducesResponseType(typeof(GetTokenResponse), (int)HttpStatusCode.OK)]
[ProducesResponseType(typeof(ErrorsResponse), (int)HttpStatusCode.BadRequest)]
[ProducesResponseType(typeof(ErrorResponse), (int)HttpStatusCode.Forbidden)]
public async Task<IActionResult> GetToken([FromBody] GetTokenRequest request)
{
    try
    {
        var token = await _authService.LoginAsync(request.Email, request.Password);
        return Ok(new GetTokenResponse { Token = token });
    }
    catch (Exception ex) when (ex is UserNotFoundException || ex is InvalidPasswordException)
    {
        return BadRequest(new ErrorsResponse("Invalid username or password."));
    }
    catch (EmailNotConfirmedException ex)
    {
        return StatusCode((int)HttpStatusCode.Forbidden, new ErrorResponse(ex.Message));
    }
}
[HttpPost(“令牌”)]
[产品响应类型(typeof(GetTokenResponse),(int)HttpStatusCode.OK)]
[ProductsResponseType(typeof(ErrorsResponse),(int)HttpStatusCode.BadRequest)]
[产品响应类型(类型(错误响应),(int)HttpStatusCode.Forbidden)]
公共异步任务GetToken([FromBody]GetTokenRequest请求)
{
尝试
{
var token=await _authService.LoginAsync(request.Email,request.Password);
返回Ok(新的GetTokenResponse{Token=Token});
}
捕获(异常ex)(ex为UserNotFoundException | | ex为InvalidPasswordException)
{
返回错误请求(新错误响应(“无效用户名或密码”);
}
捕获(EmailNotConfirmedException ex)
{
返回状态码((int)HttpStatusCode.Forbidden,新的ErrorResponse(ex.Message));
}
}
客户端服务具有发出请求的方法

public async Task<bool> LoginAsync(GetTokenRequest request)
{
    var response = await _client.PostAsJsonAsync($"{_apiUrl}{Requests.Token}", request);

    if (response.StatusCode != HttpStatusCode.OK)
    {
        return false;
    }

    var responseString = await response.Content.ReadAsStringAsync();
    var result = JsonConvert.DeserializeObject<GetTokenResponse>(responseString);
    await Authenticate(result.Token, request.Email);

    return true;
}
public异步任务LoginAsync(GetTokenRequest请求)
{
var response=wait{u client.PostAsJsonAsync($“{u apirl}{Requests.Token}”,request);
if(response.StatusCode!=HttpStatusCode.OK)
{
返回false;
}
var responseString=await response.Content.ReadAsStringAsync();
var result=JsonConvert.DeserializeObject(responseString);
等待验证(result.Token、request.Email);
返回true;
}
在当前的实现方法中,可以返回true或false,只处理GetTokenResponse,但我希望处理所有响应类型。其实这就是问题所在。最好的方法是什么?
我考虑过从服务返回响应内容,并在调用方解析响应类型,为响应创建一个基本响应类型\包装器,但最佳实践说明了什么?

我添加了引发异常的扩展方法EnsureSuccess()

public async Task LoginAsync(GetTokenRequest request)
{
    var response = await _client.PostAsJsonAsync($"{_apiUrl}{Requests.Token}", request);
    var result = await response.EnsureSuccess<GetTokenResponse>();

    await Authenticate(result.Token, request.Email);
}
public异步任务LoginAsync(GetTokenRequest请求)
{
var response=wait{u client.PostAsJsonAsync($“{u apirl}{Requests.Token}”,request);
var result=等待响应。EnsureSuccess();
等待验证(result.Token、request.Email);
}
然后在页面上

public async Task ExecuteLogin()
{
    try
    {
        await AuthService.LoginAsync(_request);
        NavigationManager.NavigateTo("/");
    }
    catch (BadRequestException ex)
    {
        var response = ex.Response.Deserialize<ErrorsResponse>();
        Errors = response.Result.Messages;
    }
    catch (ForbiddenException ex)
    {
        var response = ex.Response.Deserialize<ErrorResponse>();
        Errors = new List<string> { response.Result.Message };
    }
}
公共异步任务执行器登录()
{
尝试
{
等待AuthService.LoginAsync(_请求);
NavigationManager.NavigateTo(“/”);
}
捕获(BadRequestException-ex)
{
var response=ex.response.Deserialize();
错误=response.Result.Messages;
}
捕获(禁止例外)
{
var response=ex.response.Deserialize();
错误=新列表{response.Result.Message};
}
}

看看这个包装器。我在youtube上的作者视频中看到了。BLZ001:BlazorHow简介如何生成ErrorResponse和抽象类,并在GetTokenResponse中实现它,这样您可以返回单个类型吗?然后,客户端应用程序可以检查ErrorResponse中是否存在属性,如IsError bool或类似的?