我已经通过链接:
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
我想使用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并手动添加角色声明(如果是,在何处/如何操作)那?)?
我创建了一个 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) 我有一个带有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 …
我创建了一个用户注册控制器来注册具有存储库设计模式的用户.我的控制器看起来像这样.
[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会在不读取整个正文的情况下报告请求已完成.
我已经使用数据传输对象(DTO)封装的数据,我删除了UserForRegisterDto,并试图使用string username和string password,如下所示但没有奏效.
public async Task<IActionResult> Register([FromBody] string username, …Run Code Online (Sandbox Code Playgroud) 我有一个使用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中这样做?
我没有在Stackoverflow上找到解决方案后解决了这个问题,所以我在这里分享我的问题和答案中的解决方案.
在使用AddCors的.NET Core Web Api应用程序中启用跨域策略后,它仍无法在浏览器中运行.这是因为浏览器(包括Chrome和Firefox)将首先发送OPTIONS请求,而我的应用程序只响应204 No Content.
我有一个方法来获取标头值使用 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) 我使用 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 显示为字符串。我怎样才能在这里获得上传按钮?
我有一个带有 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
asp.net-core ×7
c# ×4
.net-core ×3
unit-testing ×2
.net-6.0 ×1
asynchronous ×1
dbcontext ×1
http ×1
minimal-apis ×1
moq ×1
postman ×1
rest ×1
signalr ×1
signalr-hub ×1
swagger ×1
xunit ×1