我想我理解ASP.NET的"会话"和"表单身份验证"之间的区别.Session主要用于存储特定于该用户会话的信息(可能是搜索过滤器的状态),并且表单身份验证用于记住他们应该可以访问某些内容.
我的问题是,为什么表格认证超时比会话超时更长?事实上,在默认情况下,web.config中设置窗体身份验证的超时时间为多长.
以下是我看到的两个场景:
null每次使用会话时都必须担心会话.null在一个地方 - 登录时 - 并且可以在必要时将其初始化.为什么场景1)会更加可取?我错过了什么吗?
我想手动解密.AspNetCore.Identity.ApplicationASP.NET Core 3.0.0 存储的 cookie,以准确查看它包含哪些信息。我知道 Microsoft 在 ASP.NET Core 2.2 和 3.0 之间显着改变了此操作的方式,因此现在 3.0 已全面发布,我想知道:如何在应用程序代码中手动解密此 cookie在核心3.0中?
我的WCF REST服务发生了一个奇怪的问题.对于接受数据的操作,假设它接受Foo类:
[WebInvoke(Method = "PUT", UriTemplate = "users/{username}")]
[OperationContract]
public void UpdateLoginUser(string username, LoginUser userUpdated) {
[...]
}
Run Code Online (Sandbox Code Playgroud)
现在我的LoginUser类继承自我的NormalUser类:
<DataContract()> _
Public MustInherit Class NormalUser
[...]
End Class
Public Class LoginUser
Inherits NormalUser
[...]
End Class
Run Code Online (Sandbox Code Playgroud)
当我PUT到我的服务,触发UpdateLoginUser时,一切正常.但是,如果我将DataContract应用于我的NormalUser类:
<DataContract()> _
Public Class LoginUser
Inherits NormalUser
[...]
End Class
Run Code Online (Sandbox Code Playgroud)
...突然,在反序列化过程中,LoginUser类的构造函数不会触发!我有需要运行的业务登录规则.那么,为什么当我将DataContract属性应用于我继承的类时,它的构造函数会停止被触发?我怎么能绕过这个?如果我想更改名称空间或名称,我需要应用DataContract属性.
每次打开Visual Studio 2008时,都会出现一个弹出对话框,提示我输入用户名和密码('连接到Team Foundation Server').可能这是因为我将TFS服务器存储在"服务器"中的"团队资源管理器"选项卡中,因此它希望在启动时连接到它.此外,当我打开解决方案与TFS源代码控制相关联的解决方案文件时,会出现这种情况,原因很明显.
我的问题与网络上各个地方描述的问题相同,例如:
在所有情况下,我可以看到,建议的解决方案是将TFS服务器凭据添加到Windows的存储凭据.我正在使用Windows 7,所以我认为你这样做的方式是在Credential Manager中.
好吧,我已经将带有我的凭据的TFS服务器添加到"Windows凭据"列表中,当我打开Visual Studio 2008时,我仍然会收到用户名和密码的提示.任何人都有任何关于如何获取它的想法用我的凭据自动登录?
更新:
我将我的TFS服务器的计算机名称以及我的用户名和密码添加到凭证管理器中(在我拥有其IP地址之前).现在,VS2008 确实负载不提示我输入凭据......但仍然VS2005提示我对他们来说,即使它在团队资源管理器注册了完全相同的服务器!更重要的是,在团队资源管理器中注册的服务器是服务器的IP,它已经存储在Windows凭据中,而不是服务器的名称.所以这仍然是一个谜.这可能是VS2005版本的Team Explorer源代码控制插件所特有的一些注册表设置吗?我可以在注册表中找到这个潜在的设置吗?
tfs visual-studio-2005 credentials visual-studio-2008 visual-studio
它经常说,你不应该使用异常定期错误处理,因为糟糕的表现。我的猜测是,性能差是由于必须实例化新的异常对象,生成堆栈跟踪等导致的。那么为什么不具有轻量级异常呢?这样的代码在逻辑上是合理的:
string ageDescription = "Five years old";
try {
int age = int.Parse(ageDescription);
}
catch (Exception) {
// Couldn't parse age; handle parse failure
}
Run Code Online (Sandbox Code Playgroud)
但是我们还是建议使用它TryParse来避免异常的开销。但是,如果异常只是在线程启动时初始化的静态对象,则抛出异常所需的所有代码都将设置一个错误代码号,甚至可能是一个错误字符串。没有堆栈跟踪,没有新的对象实例。这将是“轻量级异常”,因此使用异常的开销将大大减少。为什么我们没有这么轻量级的例外?
我正在将的更新版本合并master到我的分支中。在主文件已被删除,我也删除了。Git给了我以下内容:
Deleted merge conflict for 'Lib/SharedBL/WebServices/WebAPI/Admin/Admin.cs':
{local}: deleted
{remote}: deleted
Use (m)odified or (d)eleted file, or (a)bort?
Run Code Online (Sandbox Code Playgroud)
为什么这是冲突?双方都被删除了,所以肯定git应该删除它吗?
我正在编写一个.NET Core控制台应用程序(不是 ASP.NET Core Web应用程序)。在.NET Framework中,我将有一个App.config和App.Debug.config和一个App.Release.config文件,后者2用于转换前者。这使我可以根据创建调试还是发布版本来更改各种设置。
现在,使用.NET Core,您可以appsettings.json改用。很好,但是我该如何调试和发布转换呢?我已经读过一些有关使用环境变量来确定您是处于发行版环境还是调试环境的信息,但我确实不想这样做,并且它实际上也不适合控制台应用程序。那么,如何以与.NET Framework中类似的方式转换配置文件?
默认情况下,ASP.NET Core SPA项目模板在其.csproj文件中有一个部分,如下所示:
<!-- Include the newly-built files in the publish output -->
<ItemGroup>
<DistFiles Include="$(SpaRoot)dist\**; $(SpaRoot)dist-server\**" />
<DistFiles Include="$(SpaRoot)node_modules\**" Condition="'$(BuildServerSideRenderer)' == 'true'" />
<ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
<RelativePath>%(DistFiles.Identity)</RelativePath>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</ResolvedFileToPublish>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
我在Google上找不到任何好的文档,但是我认为本部分可能对我想做的事情有所帮助。我想出于自己的目的对其进行修改,但是首先我需要完全理解它,因此有人可以向我解释以下内容:
SpaRoot设置?ResolvedFileToPublish做什么的?DistFiles设置?FullPath设置?@(DistFiles->'%(FullPath)'“箭头符号”是什么意思?Exclude="@(ResolvedFileToPublish)"办?DistFiles.Identity指的是什么,在哪里设置?更新:此页面提供有关此项目的一些文档,但内容不多:https :
//docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore- 2.2#selective-file-inclusion
msbuild csproj visual-studio single-page-application asp.net-core
我很难确定如何将游戏中特定回合的游戏状态转换为代表该回合所采取的动作的有限动作序列。我希望得到关于如何做到这一点的建议。
注意:游戏现已上线!如果有人想尝试,请访问: https: //mystikaze.com
(我最终实现了一种用于存储游戏动作的算法,该算法可能不完全有效,但我认为确实可以保证任何给定回合的动作列表不能被无界/无限长)。
游戏规则相对简单。有一个六角形棋盘,其中六角形属于 2 个玩家。在任何给定的回合中,棋子可能已经存在于棋盘上,已在上一回合中购买,或者它们可以被购买到棋盘上(黄色棋子代表其在本回合被购买到棋盘上)。
这些棋子是“活跃的”,并且仍然可以移动。碎片也可以组合起来,并且仍然保持“活跃”状态。它们可以通过将现有的一块移动到另一块上或通过购买新的块到现有的块上来组合。组合后,目标六角形上将存在升级后的棋子。棋子可以有 3 种强度;X、Y 和 Z。X 与 X 结合得到 Y,X 与 Y 结合得到 Z。
片段可以继续像这样合并并保持“活跃”。一个棋子可以移动到其自己领土内的另一个六角形并保持“活跃”。当一个棋子被移动以捕获其他玩家的六角形时,它就不再是“活跃的”。此后它无法移动,但仍然可以结合。下面的绿色表示不活动的部分。
一个棋子也可以直接召唤到另一个棋子之上,从而产生升级的棋子(如果它已经处于活动状态,则它保持活动状态;如果它处于非活动状态,则它保持非活动状态):
现在,这很容易在游戏状态中表示;只需更新棋子和棋盘的状态以反映当前的真实情况即可。只要理论上允许该移动序列是无界的,就可以很容易地将其转换为一系列移动。碎片可以保持活跃并无限地来回移动。当然,我想限制动作的顺序。这就是我遇到麻烦的地方。我有以下2个动作:
如何将玩家所做的动作转换为有限的动作序列,以代表玩家实际所做的事情,从而达到最终状态?我不知道我是否遗漏了一些东西,但这似乎变得几乎不可能复杂到弄清楚。如果您有棋子在自己的区域内移动并保持活动状态,您可能会认为您可以将移动就地更新到新坐标,而不是向新坐标添加新移动,但如果有另一个移动,其中一块与另一块结合形成一个升级块,它依赖于第一块移动到其第一组坐标?现在就地更新移动坐标意味着第二个组合移动成为常规移动,因为它现在移动到空六角形上,但它应该仍然是组合移动(棋盘状态实际上是已移动到新坐标)。
从概念上讲,应该始终存在可以代表任何操作的有限移动序列。然而,我发现很难弄清楚如何编写一个算法来自动执行此操作。我认为至少可以防止移动的无限性质的算法是说“如果最近的移动不是组合或捕获操作,则更新一个棋子的最近移动,而不是将新移动添加到列表中”。这应该始终导致移动集正确创建游戏状态,并防止无限循环。然而,这仍然可能导致相当多的变动。例如,如果你在一个领土上有 10 个棋子,你可以移动所有 1 个棋子,捕获 1 个棋子,移动剩余的 9 个棋子,将一个棋子与另一个棋子组合,移动剩余的 8 个棋子等等,这可能会导致 10 个棋子的移动次数超过 60 次。如果有一种算法可以把这个问题降低一点,那就太好了,而且我仍然不能 100% 确定即使这个算法也没有一些无法工作的边缘情况。
我是否缺少一种相对直接的方法来解决这个问题?规则必须保持不变,但我愿意接受有关引入新移动类型的建议,如果这也有助于解决问题的话。
我正在等待的 lambda 中对引用类型变量进行初始赋值,如下所示:
private class TestClass {
public int TestInt;
}
public async Task TestMethod() {
TestClass testVar;
await Task.Run(() => {
testVar = new();
});
var testInt = testVar.TestInt;
}
Run Code Online (Sandbox Code Playgroud)
但是,最后一行给出错误“使用未分配的局部变量'testVar'”。是否存在技术原因导致 C# 的代码分析无法确定该变量已保证在该点被赋值?!在我第一次使用的地方使用操作符有点烦人testVar。如果我需要首先在等待的 lambda 中分配变量,并且不能方便地给它默认分配(这是一个相当复杂的类),有什么方法可以解决这个问题?