标签: asp.net-core-webapi

在.NET核心类库中使用依赖注入(.NET标准)

我已经通过链接:

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/dependency-injection

并了解到如何为Web API使用依赖注入.

如上面的链接所述,我可以使用Startup(Startup.cs)类在API层内部进行依赖注入.但是如何实现.NET核类库的依赖注入.下面是我如何添加类库的截图. 在此输入图像描述

我的项目结构是

在此输入图像描述

在项目"DataManagement.Repository"中,我编写了一个类"UserRepository",并在项目"DataManagement.Repository.Interfaces"中编写了一个接口"IUserRepository".

在"DataManagement.Business"项目中,我写了一个类"UserManager"

class UserManager
    {
        private IUserManager _userManager;
        public UserManager(IUserManager userManager)
        {
            _userManager = userManager;
        }
    }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在尝试通过构造函数实现依赖注入.

但我不确定在.NET Core类库(.NET标准版)中启用依赖项注入需要做哪些更改.

dependency-injection .net-core asp.net-core asp.net-core-webapi visual-studio-2017

23
推荐指数
1
解决办法
2万
查看次数

ASP.NET Core JWT映射角色声明为ClaimsIdentity

我想使用JWT保护ASP.NET Core Web API.另外,我想有一个选项,直接在控制器动作属性中使用来自令牌有效负载的角色.

现在,虽然我确实找到了如何将其与策略一起使用:

Authorize(Policy="CheckIfUserIsOfRoleX")
ControllerAction()...
Run Code Online (Sandbox Code Playgroud)

我想更好地选择使用通常的东西:

Authorize(Role="RoleX")
Run Code Online (Sandbox Code Playgroud)

其中Role将从JWT有效负载自动映射.

{
    name: "somename",
    roles: ["RoleX", "RoleY", "RoleZ"]
}
Run Code Online (Sandbox Code Playgroud)

那么,在ASP.NET Core中实现这一目标的最简单方法是什么?有没有办法通过一些设置/映射自动工作(如果是这样,在哪里设置它?)或者我应该在验证令牌后,拦截生成ClaimsIdentity并手动添加角色声明(如果是,在何处/如何操作)那?)?

c# asp.net-core asp.net-core-webapi

23
推荐指数
3
解决办法
4万
查看次数

MinimalAPI - 您是否打算将“Body(推断)”参数注册为服务或应用 [FromService] 或 [FromBody] 属性?

我创建了一个 asp.net core 空项目,每当我尝试运行我的应用程序时,它都会出现如下错误。当我点击播放时,我什至无法到达终点,它给出了错误。

System.InvalidOperationException HResult=0x80131509 Message=已推断主体,但该方法不允许推断主体参数。以下是我们找到的参数列表:

Parameter           | Source                        
---------------------------------------------------------------------------------
ur                  | Service (Attribute)
userLogin           | Body (Inferred)


Did you mean to register the "Body (Inferred)" parameter(s) as a Service or apply the [FromService] or [FromBody] attribute?
Run Code Online (Sandbox Code Playgroud)

不知道为什么我会收到此错误。然后我尝试添加[FromService],它也显示相同的错误。我针对同一问题阅读了这篇文章,但它说不要添加[Bind]我一开始就没有添加的内容,而是使用[FromService],但我仍然遇到相同的错误。我做错了什么吗?

Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<ApplicationDbContext>(x =>
    x.UseSqlServer(builder.Configuration.GetConnectionString("Default")));

builder.Services.AddScoped<IUserRepository, UserRepository>();

builder.Services.AddEndpointsApiExplorer();

builder.Services.AddSwaggerGen();

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.MapGet("/userLogin", (IUserRepository ur, UserLogin userLogin) =>
{
    return ur.Get(userLogin);
});

if …
Run Code Online (Sandbox Code Playgroud)

http asp.net-core asp.net-core-webapi .net-6.0 minimal-apis

22
推荐指数
2
解决办法
2万
查看次数

EF Core中使用带有Injected DbContext的并行异步调用的最佳做法是什么?

我有一个带有EF Core 1.1的.NET Core 1.1 API,并使用Microsoft的vanilla设置使用依赖注入为我的服务提供DbContext.(参考:https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro#register-the-context-with-dependency-injection)

现在,我正在研究使用WhenAll将数据库读取并行化为优化

所以代替:

var result1 = await _dbContext.TableModel1.FirstOrDefaultAsync(x => x.SomeId == AnId);
var result2 = await _dbContext.TableModel2.FirstOrDefaultAsync(x => x.SomeOtherProp == AProp); 
Run Code Online (Sandbox Code Playgroud)

我用:

var repositoryTask1 = _dbContext.TableModel1.FirstOrDefaultAsync(x => x.SomeId == AnId);     
var repositoryTask2 = _dbContext.TableModel2.FirstOrDefaultAsync(x => x.SomeOtherProp == AProp);   
(var result1, var result2) = await (repositoryTask1, repositoryTask2 ).WhenAll();
Run Code Online (Sandbox Code Playgroud)

这一切都很好,直到我在这些DB Repository访问类之外使用相同的策略,并在我的控制器中使用WhenAll在多个服务中调用这些相同的方法:

var serviceTask1 = _service1.GetSomethingsFromDb(Id);
var serviceTask2 = _service2.GetSomeMoreThingsFromDb(Id);
(var dataForController1, var dataForController2) = await (serviceTask1, serviceTask2).WhenAll();
Run Code Online (Sandbox Code Playgroud)

现在当我从我的控制器调用它时,随机我将得到并发错误,如:

System.InvalidOperationException:ExecuteReader需要一个开放且可用的连接.连接的当前状态已关闭.

我相信的原因是因为有时这些线程会尝试同时访问相同的表.我知道这是EF …

asynchronous entity-framework dbcontext asp.net-core-webapi

21
推荐指数
2
解决办法
1万
查看次数

应用程序在没有读取整个请求主体的情况下完成,.net core 2.1.1

我创建了一个用户注册控制器来注册具有存储库设计模式的用户.我的控制器看起来像这样.

[Route("api/[controller]")]
    public class AuthController : Controller
    {
        private readonly IAuthRepository _repo;
        public AuthController(IAuthRepository repo)
        {
            _repo = repo;
        }

        [AllowAnonymous]
        [HttpPost("register")]
        public async Task<IActionResult> Register([FromBody] UserForRegisterDto userForRegisterDto){
            // validate request
            if(!ModelState.IsValid)
            return BadRequest(ModelState);

            userForRegisterDto.Username = userForRegisterDto.Username.ToLower();

            if(await _repo.UserExists(userForRegisterDto.Username)) 
            return BadRequest("Username is already taken");

            var userToCreate = new User{
                Username = userForRegisterDto.Username
            };

            var createUser = await _repo.Register(userToCreate, userForRegisterDto.Password);

            return StatusCode(201);
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我使用Postman发送请求时,它会向我提供404未找到的状态代码,并且API会在不读取整个正文的情况下报告请求已完成.

在此输入图像描述

我在Postman的请求看起来像这样. 在此输入图像描述

我已经使用数据传输对象(DTO)封装的数据,我删除了UserForRegisterDto,并试图使用string usernamestring password,如下所示但没有奏效.

public async Task<IActionResult> Register([FromBody] string username, …
Run Code Online (Sandbox Code Playgroud)

c# .net-core asp.net-core-webapi asp.net-core-2.1

21
推荐指数
2
解决办法
2万
查看次数

如果在IActionResult类型中返回结果,如何在Xunit中获取内容值

我有一个使用Xunit的单元测试项目,我们正在测试的方法返回IActionResult.

我看到有些人建议使用"NegotiatedContentResult"获取内容,IActionResult但这在Xunit中不起作用.

所以我想知道如何获取IActionResultXunit中的内容值?

测试代码示例如下:

public void GetTest()
{
    var getTest = new ResourcesController(mockDb);

    var result = getTest.Get("1");

    //Here I want to convert the result to my model called Resource and
    //compare the attribute Description like below.
    Resource r = ?? //to get the content value of the IActionResult

    Assert.Equal("test", r.Description);
}
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何在XUnit中这样做?

c# unit-testing xunit asp.net-core asp.net-core-webapi

20
推荐指数
1
解决办法
1万
查看次数

在.NET Core Web API上为CORS启用OPTIONS标头

我没有在Stackoverflow上找到解决方案后解决了这个问题,所以我在这里分享我的问题和答案中的解决方案.

在使用AddCors的.NET Core Web Api应用程序中启用跨域策略后,它仍无法在浏览器中运行.这是因为浏览器(包括Chrome和Firefox)将首先发送OPTIONS请求,而我的应用程序只响应204 No Content.

.net-core asp.net-core asp.net-core-webapi

20
推荐指数
5
解决办法
2万
查看次数

在单元测试中模拟IHttpContextAccessor

我有一个方法来获取标头值使用 IHttpContextAccessor

public class HeaderConfiguration : IHeaderConfiguration
{
    public HeaderConfiguration()
    {

    }

    public string GetTenantId(IHttpContextAccessor httpContextAccessor)
    {
        return httpContextAccessor.HttpContext.Request.Headers["Tenant-ID"].ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在测试GetBookByBookId方法

假设该方法如下所示:

public class Book
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private IHeaderConfiguration _headerConfiguration;
    private string _tenantID;

    public Book(IHeaderConfiguration headerConfiguration, IHttpContextAccessor httpContextAccessor){
        var headerConfig = new HeaderConfiguration();
        _httpContextAccessor = httpContextAccessor;
        _tenantID = headerConfig.GetTenantId(_httpContextAccessor);
    }

    public Task<List<BookModel>> GetBookByBookId(string id){
        //do something with the _tenantId
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我对GetBookByBookId方法的单元测试

[Fact]
public void test_GetBookByBookId()
{
    //Arrange

    //Mock IHttpContextAccessor
    var …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq asp.net-core asp.net-core-webapi

20
推荐指数
2
解决办法
6732
查看次数

如何在 IFormFile 中与其他属性结合使用 swagger 获取上传按钮?

我使用 Swagger 创建了一个 Asp.net core 3.1 Web api 将文件上传到服务器。下面的代码工作正常:

    [HttpPost("PostFile")]
    public ActionResult PostFile(IFormFile uploadedFile)
    {            
        var saveFilePath = Path.Combine("c:\\savefilepath\\", uploadedFile.FileName);
        using (var stream = new FileStream(saveFilePath, FileMode.Create))
        {
            uploadedFile.CopyToAsync(stream);
        }
        return Ok();
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,我得到了一个漂亮的上传按钮。

在此输入图像描述

但是,现在我想使用不同的模型。它与 IFormFile 一起具有更多属性。

public class FileUploadRequest
{
    public string UploaderName { get; set; }
    public string UploaderAddress { get; set; }
    public IFormFile File { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用此模型时,我在 Swagger 中没有看到任何可以帮助我在请求中附加文件的上传按钮。

在此输入图像描述

由于某种原因,它将 IFormFile 显示为字符串。我怎样才能在这里获得上传按钮?

rest swagger asp.net-core asp.net-core-webapi

20
推荐指数
1
解决办法
2万
查看次数

是否可以从 Postman 调用 SignalR Hub

我有一个带有 SignalR 集线器的 ASP .Net Core 2.2 Web API。是否可以使用 Postman 调用其方法之一(例如,SendMessageToAll)?问题是我只有 API - 没有前端 - 我需要测试。

我尝试将 URl 放到 Postman (api.mydomain.com/chatHub) 中的集线器,但后来我不确定如何构建主体。我知道 SignalR 最好使用 WebSockets,我不知道 PostMan 是否具有 WebSocket 功能。如果 WebSockets 不可用,我相信 SignalR 也可以执行 HTTP 请求,这是 Postman 可以做的。但我用的是什么身体?我是使用 HTTP GET 还是 POST?

我在 Postman 中看到有人在使用这个 body 的帖子:

{
    "Target": "SendMessageToGroup",
    "Arguments": [
        "groupA",
        "hello from server"
    ]
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试了相同的方法,但是当我在邮递员上单击“发送”时,我的集线器的 SendMessageToGroup 方法不会被触发。

在此处输入图片说明

谢谢

signalr signalr-hub signalr.client postman asp.net-core-webapi

19
推荐指数
3
解决办法
9780
查看次数