自ASP.NET Core 2.1发布以来,我正在使用新的Identity UI软件包.使用新生成的MVC项目,这里有一些可用的页面URL:
/Home/About
/Home/Contact
/Identity/Account/Login
/Identity/Account/Register
Run Code Online (Sandbox Code Playgroud)
如何配置路由以/Identity/从URL中删除部分?
System.Text.Json我通过切换到ASP.NET Core 应用程序,意外地在 API 中引入了重大更改。我有一个客户端正在发送 JSON 文档,并使用数字1or0作为布尔字段而不是trueor false:
// What they're sending.
{ "Active": 1 }
// What they should be sending.
{ "Active": true }
Run Code Online (Sandbox Code Playgroud)
库Newtonsoft.Json通过将数字转换为布尔值(0 = false,其他 = true)来自动处理此问题,但System.Text.Json不会这样做;它会抛出异常。1这意味着我的 API 端点突然停止为发送's 和0's的愚蠢客户工作!
我似乎在迁移指南中找不到任何提及这一点。我想将行为恢复到 Newtonsoft 处理它的方式,但我不确定是否有一个标志可以在我看不到的地方启用它,或者我是否必须编写一个自定义转换器。
有人可以帮我恢复像 Newtonsoft 一样的行为吗?
下面是一些代码来演示该问题:
using System;
string data = "{ \"Active\": 1 }";
try
{
OutputState s1 = System.Text.Json.JsonSerializer.Deserialize<OutputState>(data);
Console.WriteLine($"OutputState 1: {s1.Active}");
}
catch (Exception …Run Code Online (Sandbox Code Playgroud) 我正在阅读正确执行数组的深层副本,但是我对如何#clone()实现它感到困惑.它是java.lang.Object该类的成员,但如果您阅读了javadoc:
首先,如果此对象的类未实现Cloneable接口,则抛出CloneNotSupportedException.
那么为什么要首先定义clone那里的方法呢?当然,如果方法只能在存在接口时使用,则将该方法放在接口中.该Cloneable接口本身是空的; 它只是Java使用的标记接口,以确保使用该clone方法是合法的.
这样做也会消除使用泛型来确保类型安全的能力:
class Foo implements Cloneable { // Valid.
@Override
public Object clone() throws CloneNotSupportedException {
// ...
}
}
class TypeSafeFoo implements Cloneable<TypeSafeFoo> { // Not valid.
@Override
public TypeSafeFoo clone() throws CloneNotSupportedException {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
为什么Java以这种方式完成它?我确信他们有合理的理由,但我似乎无法弄明白.
在 Serilog 中,您可以轻松启用滚动日志文件:
Log.Logger = new LoggerConfiguration()
.WriteTo.File("log-.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
这将每天以以下格式创建一个新的日志文件:
log-20200214.txtlog-20200215.txtlog-20200216.txt我的问题:是否可以自定义日期在文件名中的放置位置以及自定义日期的格式?
例如,我希望文件名如下所示:
2020-02-14-log.txt2020-02-15-log.txt2020-02-16-log.txt我希望替换"log-.txt"为"{Date:yyyy-MM-dd}-log.txt"会起作用,但事实并非如此。
我如何构建自己的KeyEvent对象,它完全(或非常接近)匹配我从KeyListener最终用户输入内容时收到的对象?
例如,我有一个英国的ISO键盘布局,并键入"我按下的字符Shift+2.如果我JFrame用a 记录这个KeyListener,我会收到以下事件:
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=16,keyText=Shift,keyChar=Undefined keyChar,modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_LEFT,rawCode=16,primaryLevelUnicode=0,scancode=42,extendedKeyCode=0x10] on frame0
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=50,keyText=2,keyChar='"',modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_STANDARD,rawCode=50,primaryLevelUnicode=50,scancode=3,extendedKeyCode=0x32] on frame0
java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='"',modifiers=Shift,extModifiers=Shift,keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on frame0
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=16,keyText=Shift,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=16,primaryLevelUnicode=0,scancode=42,extendedKeyCode=0x10] on frame0
java.awt.event.KeyEvent[KEY_RELEASED,keyCode=50,keyText=2,keyChar='"',keyLocation=KEY_LOCATION_STANDARD,rawCode=50,primaryLevelUnicode=50,scancode=3,extendedKeyCode=0x32] on frame0
Run Code Online (Sandbox Code Playgroud)
我想创建一个方法,我将其"作为char参数,它将返回上面列出的KeyEvents数组.
我的问题是:
在KEY_PRESSED和KEY_RELEASED事件中,keyChar='"'表示按下的字符("),但是keyCode=50指的是"非移位"的ASCII值(又名2).我需要知道如何从"字符中获取这个非移位值.
对于不同的键盘布局,此非移位值也将不同.例如,美国ANSI布局需要Shift+'键入"密钥,这意味着keyCode将是39而不是50.
在某些键盘布局中,Shift键需要键入键,而不是其他键.#例如,该字符需要Shift+3美国ANSI键盘,但不需要在英国ISO键盘上按压.我需要知道是否应该模拟移位按下/释放事件并提供移位修改器.
任何有关如何解决这些问题的见解将不胜感激.我还应该注意,Robot在我的情况下使用该类不能使用.
为什么JVM规范状态接口必须有一个super_class的java/lang/Object,即使接口不延长java/lang/Object?
我特别指的是JVM规范的§4.1,它说:
对于接口,super_class项的值必须始终是constant_pool表的有效索引.该索引处的constant_pool条目必须是表示Object类的CONSTANT_Class_info结构.
但是在JLS的第9.2节中,它表示接口不会扩展Object.而是声明一个隐式创建的抽象方法,它匹配Object类中的每个公共方法:
如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法m,其中包含签名s,返回类型r和throws子句t,对应于具有签名s的每个公共实例方法m,返回类型r和throws子句t在Object中声明,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法.
如果您在Java中有一个私有静态嵌套类,是否仍建议使用getter和setter而不是直接字段访问?
一个例子.直接现场访问:
public class Application {
private List<MyInnerClass> myInnerClassList;
// ...
public void foo() {
MyInnerClass inner = new MyInnerClass();
inner.bar = 50;
myInnerClassList.add(inner);
}
private static class MyInnerClass {
private int bar;
}
}
Run Code Online (Sandbox Code Playgroud)
vs封装:
public class Application {
private List<MyInnerClass> myInnerClassList;
// ...
public void foo() {
MyInnerClass inner = new MyInnerClass();
inner.setBar(50);
myInnerClassList.add(inner);
}
private static class MyInnerClass {
private int bar;
public int getBar() {
return bar;
}
public void setBar(int bar) {
this.bar = bar; …Run Code Online (Sandbox Code Playgroud) 假设我有三个用户,我想按国家对他们进行分组.我会这样做:
var users = new[]
{
new User { Name = "Phil", Country = "UK" },
new User { Name = "John", Country = "UK" },
new User { Name = "Mike", Country = "USA" }
};
List<IGrouping<string, User>> groupedUsers
= users.GroupBy(user => user.Country).ToList();
Run Code Online (Sandbox Code Playgroud)
现在假设我的程序稍后会再增加三个用户,所以我也将它们分组:
var moreUsers = new[]
{
new User { Name = "Phoebe", Country = "AUS" },
new User { Name = "Joan", Country = "UK" },
new User { Name = "Mindy", Country = "USA" } …Run Code Online (Sandbox Code Playgroud) Task.Delay可以告知延迟的最大持续时间是int.MaxValue毫秒.什么是最干净的方式来创造一个Task超过那个时间的延迟?
// Fine.
await Task.Delay(TimeSpan.FromMilliseconds(int.MaxValue));
// ArgumentOutOfRangeException
await Task.Delay(TimeSpan.FromMilliseconds(int.MaxValue + 1L));
Run Code Online (Sandbox Code Playgroud) 我正在使用 ASP.NET Core 5 Web API,并且我正在尝试使用新的C# 记录作为我的模型类。但是,每当我使用以下with表达式更新修改后的模型时,都会收到有关跟踪问题的 EF Core 错误:
System.InvalidOperationException: The instance of entity type 'Product' cannot be
tracked because another instance with the key value '{ID: 2}' is already being
tracked. When attaching existing entities, ensure that only one entity instance
with a given key value is attached.
Run Code Online (Sandbox Code Playgroud)
我相信这是由于“变异”记录如何创建新的对象实例而 EF Core 的跟踪系统不喜欢这样,但我不确定修复它的最佳方法。有人有什么建议吗?或者我应该回到使用常规课程而不是记录?
这是重现问题的片段:
// Models/Product.cs
public record Product(int ID, string Name);
// Controllers/ProductController.cs
[HttpGet("test/{id}")]
public async Task<Product> ExampleControllerAction(int id, CancellationToken cancellationToken)
{
string newName …Run Code Online (Sandbox Code Playgroud)