Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Asp.net core web api asp net内核中返回什么_Asp.net Core_Types_Model_Return - Fatal编程技术网

Asp.net core web api asp net内核中返回什么

Asp.net core web api asp net内核中返回什么,asp.net-core,types,model,return,Asp.net Core,Types,Model,Return,我不确定在LoginAsync方法中应该返回什么。有时返回错误,但有时身份验证成功。我目前正在使用dynamic,但听说这是一种糟糕的做法。我应该用什么? 它是AccountService中的LoginAsync服务: public async Task<dynamic> LoginAsync(User user) { var existingUser_byEmail = await FindUserByEmailAsync(user.Email); if (exi

我不确定在LoginAsync方法中应该返回什么。有时返回错误,但有时身份验证成功。我目前正在使用dynamic,但听说这是一种糟糕的做法。我应该用什么? 它是AccountService中的LoginAsync服务:

public async Task<dynamic> LoginAsync(User user)
{
    var existingUser_byEmail = await FindUserByEmailAsync(user.Email);

    if (existingUser_byEmail == default)
        return new Error
        {
            StatusCode = 400,
            ErrorMessages = { { "email", "Nie odnaleziono użytkownika z podanym adresem e-mail" } }
        };

    if (BCrypt.Net.BCrypt.EnhancedVerify(user.Password, existingUser_byEmail.Password))
        return new AuthSuccessful { StatusCode = 200, Token = _jwtService.GenerateToken(existingUser_byEmail) };
    else
        return new Error { StatusCode = 401, ErrorMessages = { { "password", "Błędne hasło" } } };
}
public异步任务LoginAsync(用户)
{
var existingUser_byEmail=wait FindUserByEmailAsync(user.Email);
if(existingUser_byEmail==默认值)
返回新错误
{
状态代码=400,
ErrorMessages={{“email”,“Nie odnaleziono użytkownika z podanym adresem e-mail}
};
if(BCrypt.Net.BCrypt.EnhancedVerify(user.Password,existingUser_byEmail.Password))
返回新的AuthSuccessful{StatusCode=200,Token=\u jwtService.GenerateToken(existingUser\u byEmail)};
其他的
返回新错误{StatusCode=401,ErrorMessages={{“password”,“Błdne hasło”};
}
以及AccountController中的登录方法:

[HttpPost("login")]
public async Task<IActionResult> LogIn([FromBody] User user)
{
    var response = await _accountService.LoginAsync(user);
    return StatusCode(response.StatusCode, response);
}
[HttpPost(“登录”)]
公共异步任务登录([FromBody]用户)
{
var response=await\u accountService.LoginAsync(用户);
返回状态码(response.StatusCode,response);
}

谢谢你的回答,祝你有愉快的一天你有多种选择

1.接口/基类 似乎您返回的所有内容都具有类似的结构–一个
StatusCode
属性,以及一些在给定状态代码上下文中有意义的其他属性

因此,最明显的可能是为它们创建基类或接口,如下所示:

公共接口IOperationResult
{
int StatusCode{get;init;}
对象响应{get;}
}
公共类错误:IOperationResult
{
公共int状态码{get;init;}
公共字符串[,]错误消息{get;init;}
公共对象响应=>ErrorMessages;
}
公共类AuthSuccessful:IOperationResult
{
公共int状态码{get;init;}
公共字符串标记{get;init;}
公共对象响应=>令牌;
}
这是一个定义良好的结构,当您可能必须检查返回值的确切类型并以类型安全的方式访问返回值上的属性时,它可以支持更复杂的业务逻辑

2.值元组 我最近经常使用的另一个选项是返回一个值元组,其中一个成员包含成功/失败,另一个成员包含结果;像下面这样。这种情况看起来很糟糕,因为没有定义错误消息的格式。但是如果你用一个类或结构来做这个,那就很好了

public异步任务LoginAsync(用户)
{
var existingUser_byEmail=wait FindUserByEmailAsync(user.Email);
if(existingUser_byEmail==默认值)
返回(状态代码:400,回复:new[]{new[]{“email”,“Nie odnaleziono użytkownika z podanym adresem email”});
if(BCrypt.Net.BCrypt.EnhancedVerify(user.Password,existingUser_byEmail.Password))
返回(状态代码:200,响应:_jwtService.GenerateToken(现有用户通过电子邮件));
其他的
返回(状态代码:401,响应:new[]{new[]{“password”,“Błędne hasło”});
}
//然后可以执行元组解构赋值:
[HttpPost(“登录”)]
公共异步任务登录([FromBody]用户)
{
var(statusCode,response)=等待_accountService.LoginAsync(用户);
返回状态码(状态码、响应);
}
3.在服务外部执行HTTP代码和错误消息选择 更传统的做法是从身份验证服务返回不同的标志,然后将其映射到靠近控制器(或控制器内部)的某个HTTP代码。通过这种方式,您可以避免将服务耦合到HTTP关注点,这可以说不应该是他们的责任

例如,许多内置标识服务使用
Microsoft.AspNetCore.Identity.SignInResult

在下面的实现中,我更改了
LoginAsync
方法,以在密码无效和电子邮件无效的情况下返回失败的结果。这实际上是一种更好的做法,因为如果你告诉试图登录的人某个电子邮件地址有或没有帐户,你就泄露了用户信息

public异步任务LoginAsync(用户)
{
var existingUser_byEmail=wait FindUserByEmailAsync(user.Email);
if(existingUser_byEmail==默认值)
返回(SignInResult.Failed,null);
if(BCrypt.Net.BCrypt.EnhancedVerify(user.Password,existingUser_byEmail.Password))
return(SignInResult.Success,_jwtService.GenerateToken(现有用户通过电子邮件));
其他的
返回(SignInResult.Failed,null);
}
[HttpPost(“登录”)]
公共异步任务登录([FromBody]用户)
{
var(结果,令牌)=等待_accountService.LoginAsync(用户);
if(result.successed)
返回Ok(令牌);
//如有必要,处理锁定和“不允许登录”情况。
未经授权返回(“无效密码或电子邮件”);
}