我知道已经提出了这样的问题,但是解决方案并没有帮助我。
[Fact]
public async Task UpdateAsync()
{
string newTitle = "newTitle1";
int newBrandId = 3;
var item = await storeContext.Items.AsNoTracking().FirstOrDefaultAsync();
item.BrandId = newBrandId;
item.Title = newTitle;
storeContext.Entry(item).State = EntityState.Detached;
await service.UpdateAsync(item); // exception inside
var updatedItem = await storeContext.Items.AsNoTracking().FirstOrDefaultAsync();
Assert.Equal(newTitle, updatedItem.Title);
Assert.Equal(newBrandId, updatedItem.BrandId);
}
public async Task UpdateAsync(T entity)
{
_dbContext.Entry(entity).State = EntityState.Modified; // exception when trying to change the state
await _dbContext.SaveChangesAsync();
}
Run Code Online (Sandbox Code Playgroud)
消息:System.InvalidOperationException:无法跟踪实体类型'Item'的实例,因为已经跟踪了另一个具有相同'{'Id'}键值的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用'DbContextOptionsBuilder.EnableSensitiveDataLogging'来查看冲突的键值。
有趣的是,即使没有任何项目从数据库撤回,异常也是一样的,就像这样
//var item = await storeContext.Items.AsNoTracking().FirstOrDefaultAsync();
var item = new Item()
{
Id = 1, …Run Code Online (Sandbox Code Playgroud) ASP NET CORE 2 我有以下页面模型代码
public class CreateModel : PageModel
{
private readonly IItemService _itemService;
public ItemCreateViewModel ItemModel { get; set; }
public CreateModel(IItemService itemService)
{
_itemService = itemService;
}
// all related data downloaded from db, so all rendered correctly
public async Task OnGet(ItemCreateViewModel itemModel)
{
ItemModel = await _itemService.GetCreateViewModel();
}
public async Task<IActionResult> OnPost(ItemCreateViewModel itemModel)
{
if (!ModelState.IsValid)
{
return Page();
}
var item = _itemService.CreateItem(itemModel);
var image = await ImagesController.ProcessFormImage(itemModel.ImageUpload.UploadPhoto, item.Id, ModelState);
if (!ModelState.IsValid)
{
//trouble is …Run Code Online (Sandbox Code Playgroud) 我做了一些研究,并且没有太多关于注册手动 DI 标准类的信息。尝试在 asp net core 2.1 应用程序中实现单元测试时遇到很多问题,这是最后一个。尝试 UserManager 创建的 SignInAsync 用户时出现空引用异常 - 似乎无法注入 IServiceProvider 实例
var userManager = Resolve<UserManager<ApplicationUser>>();
await signInManager.SignInAsync(userManager.FindByIdAsync(adminId), false); // here
Run Code Online (Sandbox Code Playgroud)
值不能为空。参数名称:提供程序位于 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider 提供程序),位于 Microsoft.AspNetCore.Identity.SignInManager
1.SignInAsync(TUser user, AuthenticationProperties authenticationProperties, String authenticationMethod) at UnitTests.TestBase1.ConfigureIdentity() in C:\Users\alexa\source\repos\octopusstore\UnitTests\ TestBase.cs:第 72 行
像这样解决
protected static ServiceCollection services = new ServiceCollection();
protected T Resolve<T>()
{
var serviceProvider = services.BuildServiceProvider();
return serviceProvider.GetRequiredService<T>();
}
Run Code Online (Sandbox Code Playgroud)
我如何注册依赖项,到目前为止它有效
services.AddDbContext<AppIdentityDbContext>();
var conf = new Mock<IConfiguration>();
services.AddSingleton<IConfiguration>(conf.Object);
services.AddSingleton<IServiceProvider, ServiceProvider>() ; // except for this
services.AddSingleton(services.BuildServiceProvider()); // and …Run Code Online (Sandbox Code Playgroud) 由于某种原因,我的RESTful应用允许在一定时间内允许来自Angular客户端的令牌过期请求。生成令牌:
private async Task<string> GenerateJwtToken(ApplicationUser user)
{
var claims = new List<Claim>
{
new Claim(JwtRegisteredClaimNames.Sub, user.Email),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(ClaimTypes.NameIdentifier, user.Id)
};
claims.AddRange(await _userManager.GetClaimsAsync(user));
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration.GetSection("SigningKey").Value));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var expires =
DateTime.Now.AddSeconds(10);
//DateTime.Now.AddDays(Convert.ToDouble(_configuration["ExpireDays"]));
var token = new JwtSecurityToken(
issuer: _configuration["Issuer"],
audience: _configuration["Audience"],
claims: claims,
expires: expires,
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
Run Code Online (Sandbox Code Playgroud)
在客户端请求之前,我记录了到期时间,现在,如果现在超过了到期时间。两个成功请求的日志,但是最后一个应该失败
t:2018年9月18日星期二08:53:43 GMT + 0300(莫斯科标准时间)凭据服务.ts:101
现在:2018年9月18日星期二08:53:41 GMT + 0300(莫斯科标准时间)凭据服务:ts:102
假
真意味着过期
credits-service.ts:100 t:2018年9月18日星期二08:53:43 GMT + 0300(莫斯科标准时间)
credits-service.ts:101现在:2018年9月18日星期二08:58:01 GMT + 0300(莫斯科标准时间) …
我的任务是容器化遗留控制台工作应用程序,我在各处使用 async\await 重写了该应用程序。我的上级质疑我的选择,因为没有理由将其引入到独立的单线程应用程序中,因为线程池不太可能耗尽。我没有答案来证明使用它的合理性,除了它是相当长一段时间以来编写代码的标准方法之外。它有什么实质性的好处吗?
我有一个非常简单的应用程序,带有 CORS 中间件,它似乎工作正常,并且预检请求按预期工作。但由于某种原因,服务器根据实际请求响应 307。在浏览器中复制,邮递员工作正确。
func main() {
router := gin.Default()
router.Use(CORSMiddleware())
accountsGroup := router.Group("/accounts")
accountsGroup.POST("/", postAccount)
router.Run("localhost:8080")
}
func CORSMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("Access-Control-Allow-Origin", "*")
c.Header("Access-Control-Allow-Credentials", "true")
c.Header("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With")
c.Header("Access-Control-Allow-Methods", "POST,HEAD,PATCH, OPTIONS, GET, PUT")
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(204)
return
}
c.Next()
}
func postAccount(c *gin.Context) {
response := gin.H{"id": 1}
c.IndentedJSON(http.StatusCreated, response)
}
Run Code Online (Sandbox Code Playgroud)
飞行前响应
实际要求
服务器日志
[GIN-debug] Listening and serving HTTP on localhost:8080
[GIN] 2022/04/17 - 16:50:45 …Run Code Online (Sandbox Code Playgroud)