我有一个类包含一些私有/受保护的字段和一些返回字段值的公共getter.我正在尝试使用OnModelCreating中的DbModelBinder上的流畅API将字段映射到数据库列.我不能使用带有受保护的setter的自动属性,所以请不要提供这个作为我的问题的解决方案.它可能工作我肯定但我不能使用自动属性,因为域类是共享代码,并与其他不同的ORM一起使用,这些ORM具有不同的映射字段的方式,不幸的是一个不支持au
我使用以下代码(在stackoverflow上找到)来访问受保护的字段,以便我可以在映射时使用表达式:
public static class ObjectAccessor<T>
where T : class
{
public static Expression<Func<T, TResult>> CreateExpression<TResult>(string propertyOrFieldName)
{
ParameterExpression param = Expression.Parameter(typeof(T), "propertyOrFieldContainer");
Expression body = Expression.PropertyOrField(param, propertyOrFieldName);
LambdaExpression lambda = Expression.Lambda(typeof(Func<T, TResult>), body, param);
return (Expression<Func<T, TResult>>)lambda;
}
}
Run Code Online (Sandbox Code Playgroud)
如果字段名称是m_username但是如果我使用_username我得到一个ModelValidationException:在模型生成期间检测到一个或多个验证错误:System.Data.Edm.EdmProperty:Name:不允许指定的名称:'_ username ".
我不能使用没有下划线的camelcase,因为上面的帮助程序无法区分公共Username属性和受保护的用户名字段.我真的很想继续使用没有字母前缀的下划线camelcase.
是否可以以某种方式配置ModelBinder,以便验证接受带有前导下划线的属性名称?
提前致谢,
标记
通过IdentityServer3和AspNet Identity,我们可以利用PostAuthenticateLocalAsync并返回AuthenticateResult,这允许我们支持不同的登录工作流程,例如双因素,EULA接受,以及强制用户更改其本地密码.因此,在完成这些工作流程之前,不会发布"真正的"经过身份验证的cookie.我认为这个过程被称为部分登录过程.
继续使用IdentityServer4和AspNet Core 2.0标识我们现在希望AspNet Identity组件能够完全管理登录工作流程,从而消除IS4对支持部分登录过程的责任.
我查看了AspNet Identity的SignInManager的代码,看看2fa登录是如何工作的,因为我希望它以部分登录方式运行,即在2fa握手完成之前不会发出正确的cookie.它似乎通过使用IdentityConstants.TwoFactorUserIdScheme临时存储2fa信息来实现.
本地和外部登录进程都调用SignInOrTwoFactorAsync,因此我认为我可以在自定义SignInManager中覆盖此方法并执行类似于IdentityServer3的原始部分登录的行为(然后在部分流完成后找出继续登录的方法).换句话说,我会阻止SignInAsync生成一个真正的cookie,直到完成部分流程.
有没有人尝试使用当前的AspNetCore 2.0身份?如果是这样,是否有任何开源示例?
如果这是实现部分登录流程的正确或首选方式,我希望我所讨论的方法的名称可以更少地与2fa耦合.
存在实现CQRS +事件源架构的各种示例应用和框架,并且大多数描述使用事件处理器来从存储在事件存储中的域事件创建非规范化视图.
托管此体系结构的一个示例是作为web api,它接受写入端的命令并支持查询非规范化视图.此Web api可能会扩展到负载平衡服务器场中的许多计算机.
我的问题是读取模型事件处理程序托管在哪里?
可能的情况:
在单独的主机上托管在单一的Windows服务中. 如果是这样,那不会造成单点故障吗?这可能使部署复杂化,但它确实保证了单个执行线程.缺点是读取模型可能会出现延迟增加的情况.
作为web api本身的一部分托管. 如果我正在使用EventStore,例如,对于事件存储和事件订阅处理,将为每个单个事件触发多个处理程序(每个Web场进程中一个),从而在处理程序尝试读/写时引起争用到他们的读店?或者,对于给定的聚合实例,我们是否保证在事件版本顺序中一次处理一个所有事件?
我倾向于方案2,因为它简化了部署并且还支持需要也监听事件的流程管理器.虽然只有一个事件处理程序应该处理单个事件,但情况相同.
EventStore可以处理这种情况吗?其他人如何在最终一致的架构中处理事件处理?
编辑:
为了澄清,我在谈论将事件数据提取到非规范化表中的过程,而不是在CQRS中读取那些表中的"Q".
我想我正在寻找的是我们如何"应该"实现和部署可以支持冗余和扩展的读取模型/ sagas/etc的事件处理的选项,当然假设事件处理是以幂等方式处理的.
我已经阅读了两个可能的解决方案,用于处理在事件存储中保存为事件的数据,但我不明白哪个应该用于另一个.
活动巴士
事件总线/队列用于在保存事件后通常由存储库实现发布消息.感兴趣的各方(订阅者),例如阅读模型或传奇/流程管理者,以某种方式使用总线/队列来以幂等方式处理它.
如果队列是pub/sub,这意味着每个下游依赖项(读取模型,sagas等)每个只能支持一个进程来订阅队列.不止一个流程意味着每个流程处理相同的事件,然后竞争以使下游变更.幂等处理应该处理一致性/并发性问题.
如果队列是竞争消费者,我们至少可以在每个Web场节点中托管订户以实现冗余.虽然这需要每个下游依赖的队列; 一个用于sagas /流程管理器,一个用于每个读取模型等,因此存储库必须发布到每个以获得最终的一致性.
认购/饲料
订阅/馈送,其中感兴趣的各方(订户)按需读取事件流并从已知检查点获取事件以便处理成读取模型.
如果需要,这对于重新创建读取模型非常有用.但是,按照通常的发布/订阅模式,似乎每个下游依赖项只应使用一个订阅者进程.如果我们为同一事件流注册多个订户,例如每个Web场节点中有一个订户,则他们都将尝试处理和更新相同的相应读取模型.
我正在使用 Microsoft.AspNetCore.SignalR 2.1 v1.0.4,并且使用 v1.0.4 的打字稿客户端使用 ChannelReader 流。
频道显示特定于单个实体的事件数据,因此当客户端的用户导航到该单个实体的页面呈现数据时,预计客户端将订阅频道。如果用户导航到同一页面但针对不同的实体,则客户端将进行另一个订阅调用。
现在我的问题是关于如何最好地取消订阅流,以及一般来说,流的生命周期对于集线器连接停止/启动场景下的客户端来说是什么,以及服务器是否显式中止连接(由于 access_token 超时从而触发客户端刷新他们的连接)?
似乎没有从 api 中浮现出一些连接状态,所以我目前使用 RxJs Subject 将一些连接状态呈现给我的 UI 组件/服务,即当集线器连接的启动调用成功时,我浮现“真”,当onclose 回调称为 I 表面“假”。这允许我尝试在先前订阅的流上调用 dispose 以在连接断开/停止期间清理内容,然后在成功启动调用时再次调用订阅流。
我试过在一个流上调用 dispose 如果集线器已连接,这很好,但如果连接处于断开状态,它会出错。我想知道这是否是一个错误。即使集线器断开连接,我也应该能够处理流吗?
可以只做一个delete streamsubscription然后根据需要重新创建,还是会以任何方式泄漏?
我有一个返回FileStreamResult的MVC4 GET动作方法.存在一种要求,即仅使用SSL并且不允许缓存所提供的文档,因此使用SSL,并且我还使用具有以下属性的OutputCache过滤器:
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None", Location = OutputCacheLocation.None)]
Run Code Online (Sandbox Code Playgroud)
这符合预期,并产生以下响应标头:
Cache-Control: no-cache, no-store
Expires: -1
Pragma: no-cache
Run Code Online (Sandbox Code Playgroud)
一切都很好,直到被要求也支持IE8,并且这里的许多人也遇到了文件,不会同时下载no-cache set和SSL.IE8及以下的解释是添加一些实际上不可行的注册表设置,或者删除违反基本要求的无缓存标头.
我尝试使用Fiddler和IE8并且能够下载文件,如果我刚删除了pragma:no-cache标头但保留了Cache-Control.这似乎没有在我的临时Internet文件中留下文档的副本,但我可能需要对此进行更多测试.
考虑到这些信息,我认为使用操作过滤器删除编译指示可能是一项简单的任务,但似乎无论我做什么,我无法更改OutputCache将要设置的任何内容.我甚至删除了OutputCache属性并使用了:
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Run Code Online (Sandbox Code Playgroud)
单独使用此方法可确保我获得与以前相同的缓存设置,但不会在此方法调用时设置它们.这只是设置缓存策略,该策略在响应管道中的某个点应用,但我不知道在哪里.
有没有人知道是否有一种方法可以连接到响应管道以在写入时更改缓存头?
编辑 我已经在管道中添加了一个简单的自定义IHttpModule,它在响应NameValueCollection中查找并删除任何Pragma头,并且在设置缓存控件时,pragma不存在.这是否意味着IIS 7.5正在根据它在缓存控件中看到的内容插入pragma本身?我知道我没有为一个简单的网站设置超出默认值的东西.
编辑 检查模块中的Cache-Control标头值并将其设置为私有,以便缓存标头尚未应用于响应.因此,在执行模块后,似乎会添加缓存标头?
UseStatusCodePagesWithReExecute我在尝试为返回 NotFound 结果的页面请求显示自定义 404 错误页面时,在 dotnet razor Pages Web 应用程序中遇到了问题。具体来说,如果我从 OnGet 方法返回 NotFound,我会发现再次调用相同的请求,并且永远不会重新执行提供给中间件的路径。
我正在使用 .NET Core 3.0,因此尚未尝试过以前的版本或 3.1 预览版。
我已经成功地通过一个简单的重现来复制了这个问题。以下将允许无效路由重定向到错误页面(例如https://localhost:5001/foo),但是,该路由https://localhost:5001/将被调用两次并且不会重定向到错误页面。
所以我要问的问题是,这是一个错误还是我在这里遗漏了一些概念?我已经尝试过相关的UseStatusCodePagesWithRedirects方法,并且它执行了它所说的操作,但如果可以的话,我真的很想使用重新执行。
再现
环境:
脚步:
dotnet new webapp -n myapp。Index.cshtml.cs OnGet方法如下: public IActionResult OnGet()
{
return NotFound();
}
Run Code Online (Sandbox Code Playgroud)
Startup.cs并添加app.UseStatusCodePagesWithReExecute("/Error");到配置方法中的 if/else 代码块后面,如下所示: public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{ …Run Code Online (Sandbox Code Playgroud) 我遇到 msdeploy 未同步站点子应用程序(例如默认网站)的应用程序池信息的问题。
本质上,我希望能够创建 webdeploy/msdeploy 包作为多个开发分支的夜间构建过程的一部分,然后将这些特定于分支的包部署到服务器进行冒烟测试。一切似乎都有道理,但不幸的是我找不到一种方法来设置已部署包的 iisApp 打算使用的应用程序池。我可以创建和部署包含 appPoolConfig 提供程序的包来支持应用程序池本身的创建,但如果我无法在正在部署的应用程序上设置应用程序池,则这是无用的。
顺便说一句,我觉得我几乎在重复其他看似相似的问题。对于使用 appPoolconfig 或 appPoolExtension 给出了各种答案,但我对这些没有运气。根据我的阅读,appPoolConfig 用于同步应用程序池本身,而不是“分配”给应用程序的应用程序池。顺便说一句,这种类型的同步操作效果很好。至于 appPoolExtension 我不知道它在打开时实际上会做什么,因为我发现生成的包没有任何区别。
我可以使用一组简单的步骤重新创建问题,这些步骤仅使用 msdeploy,而不使用 WPP/webdeploy/msbuild,其目的是它应该单独使用最低级别的工具:
Windows 8(注意:我也可以在 Win 2008 R2 上复制该问题)、已安装 IIS 和 Web Deploy 3.0。
类型 >
msdeploy -verb:sync -source:iisApp="Default Web Site/TestApp" -dest:package=c:\temp\testapp.zip,encryptPassword="password" -enableLink:AppPoolExtension
Run Code Online (Sandbox Code Playgroud)假设我们仍然在 IIS 中将 TestPool 应用程序池配置为可用池,请输入 >
msdeploy -verb:sync -source:c:\temp\testapp.zip,encryptPassword="password" -dest:iisApp="Default Web Site/TestApp" -enableLink:AppPoolExtension
Run Code Online (Sandbox Code Playgroud)任何帮助表示赞赏。
编辑:只需对上述步骤进行变体,然后在两个 msdeploy 命令行中将“iisApp”更改为“appHostConfig”,并且保留应用程序池设置,因此从 msdeploy 的角度来看是成功的。但是,如果这是解决方案,如何通知 …