我正在尝试使用VSTS(现在是Azure DevOps)来执行CI/CD管道.对于我的构建管道,我有一个非常基本的设置,涉及执行恢复,构建,测试和发布步骤.
对于我的测试步骤,我设置了运行两个测试项目 - 一个单元测试项目和一个集成测试项目.我有我的密钥保管库访问策略设置,以提供对我自己和Azure Devops的访问.当我使用visual studio在本地运行我的测试时,当我登录到可以访问azure密钥库的同一帐户时,我可以毫无错误地运行测试.
我的应用程序配置为使用以下设置访问密钥保管库:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((ctx, builder) =>
{
var keyVaultEndpoint = GetKeyVaultEndpoint();
if (!string.IsNullOrEmpty(keyVaultEndpoint))
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
builder.AddAzureKeyVault(keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
}
}
)
.UseStartup<Startup>();
Run Code Online (Sandbox Code Playgroud)
当我运行构建管道时,我正在使用Hosted VS2017实例来构建我的项目.除了尝试访问密钥库的集成测试失败之外,一切都在运行.我使用以下包:
我按照本教程https://docs.microsoft.com/en-us/azure/key-vault/tutorial-web-application-keyvault来设置密钥保险库并将其集成到我的应用程序中.
我只是试图通过确保单元和集成测试通过来使我的构建工作.我还没有将它部署到应用服务中.单元测试没有任何问题,因为我在嘲笑各种服务.我的集成测试失败,出现以下错误消息.如何获得对密钥保管库的测试访问权限?我是否需要为托管VS2017构建的密钥保管库添加任何特殊访问策略?不知道该怎么办,因为我没有看到任何突出的东西.
下面是错误的堆栈跟踪:
2018-10-16T00:37:04.6202055Z Test run for D:\a\1\s\SGIntegrationTests\bin\Release\netcoreapp2.1\SGIntegrationTests.dll(.NETCoreApp,Version=v2.1)
2018-10-16T00:37:05.3640674Z Microsoft (R) Test Execution Command Line Tool Version 15.8.0 …Run Code Online (Sandbox Code Playgroud) 我遇到了一个问题,我无法让 nginx 与 gRPC 一起正常工作。我正在使用 .Net core 3.1 来为支持 REST 和 gRPC 的 API 提供服务。
我正在使用以下 docker 图像:
客户端在本地运行,因为我只是通过 nginx 连接到 docker 容器(端口 8080 和 443 映射到主机)
我已经在 docker 容器中构建了 API 映像,并且正在使用 docker compose 来启动所有内容。
在 gRPC 方面,我的 API 相当简单:
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<CartService>();
endpoints.MapControllers();
});
Run Code Online (Sandbox Code Playgroud)
我在我的 API 前面有 nginx 作为反向代理,下面是我的 nginx 配置。但是 rpc 调用不起作用。我无法通过客户端连接到 gRPC 服务,它返回 502 请求。我得到一个2020/06/29 18:33:30 [error] 27#27: *3 upstream sent too large http2 frame: 4740180 while reading response …
我还没有找到这方面的具体例子。我知道每个有界上下文都有自己的实体版本,您不应该跨上下文共享实体。但是,在使用像 EF 这样的 ORM 时,我该如何管理这个问题呢?
例如,下面是我的实体及其存在的有界上下文:
成分(实体有界上下文 A)
配方(实体有界上下文 b)
成分(实体有界上下文 b)
MenuItem(聚合有界上下文 b)
现在,每个有界上下文都有自己的成分版本。但由于我在 EF 中有一个单一的数据库上下文来管理它,我到底该如何安排它呢?我正在使用 CQRS,因此我可以在需要时触发事件。我的计划是在我的 Recipe 实体中维护一个 id 列表,并从数据库中提取相关成分,以便数据不会重复。
但我不确定我的数据重复担忧是否有效。在上面的例子中,想象一家企业不仅销售原料,而且还拥有可以在食品摊上销售的预设食谱(带有原料列表)。
在一种上下文中,成分与另一个实体没有关系,而在另一种上下文中,它是子实体(聚合)。我可以看到它应该如何设计(有界上下文中的单独实体),但是当涉及到数据库时,它实际上是如何设置的?如果成分的上下文 A 和上下文 B 中需要跟踪的属性/领域知识不同怎么办?这最终会成为一个单独的表吗?我对此有点迷失。
编辑:请记住我在这里只使用 1 个数据库。我知道通常每个有界上下文都有单独的数据库来避免这种情况,但想知道如何通过 1 个数据库来实现这一点。
使用 gRPC 时,我遇到了正确架构的问题。在传统的DDD方法中,核心项目(即最内层/领域层)没有对外层的引用,仅真正包含实体/聚合/接口/值对象等。这些的实际实现可能会在不同的层中进行(基础设施/应用程序/等)
使用 gRPC,合约(即接口)是在原始文件级别定义的。但是这些原始文件必须编译为服务器/客户端才能工作。从我对 DDD 的介绍来看,核心层实际上不应该有包引用(例如,在 .Net core 中,我为我的核心域项目使用 .Netstandard 2.1 项目 - 它没有外部 nuget 包引用并且保持干净)。在正常情况下,您可以为标记接口等构建特定于域层的接口,以避免外部依赖项污染域层。但对于原始文件,这是不可能的。
我可以选择三个选项:
我想知道正确的方法是什么。我可以看到所有人的优点和缺点,但想了解一些关于一种方法是否比其他方法更好的信息。
我试图-在字符串中的所有奇数之间放置一个.因此,如果传入一个字符串,Hel776o它应该输出Hel7-76o.破折号应仅放在两个连续的奇数之间.
我试图通过String.replaceAll()在一行中执行此操作
我有以下几行:
return str.replaceAll(".*([13579])([13579]).*","$1-$2");
Run Code Online (Sandbox Code Playgroud)
如果有任何奇数,后跟一个奇数,则-在它们之间放置一个.但它破坏性地取代了除了最后一场比赛之外的一切.
例如,如果我传入"999477"它将输出7-7而不是9-9-947-7.是否需要更多分组,所以除了比赛之外,我不会更换所有内容?
我已经通过传统的循环遍历字符串中的每个字符串,但希望在带有正则表达式替换的单行中执行此操作.
编辑:我应该说我的意思return str.replaceAll(".*([13579])([13579]).*","$0-$1");而不是$1和$2
我正在使用 Bootstrap 4。我在中型和大型显示器上创建了一行 3 列,每列大小为 4。每张卡片中的内容可能大小不同,但我仍然希望每张卡片的长度相同。
我没有使用卡片组/卡片组,因为它们没有响应,我希望卡片在 small/xs 显示器上占据所有 12 行。
下面是与卡片相关的代码片段。我还有一个关于 Plunker 的实时视图项目:http ://plnkr.co/edit/RLQaA6knYi69qc4vLr6j?p=info 。如果您在大显示器上打开项目,则卡片的大小不同。
Bootstrap 4 说如果没有提供宽度,卡片默认会拉伸以填充其容器的整个宽度。假设它填充了包含卡片的父容器的整个宽度(即在下面的情况下 col-md-4 的 div),我错了吗?
如果我错了,我该如何让 3 张卡片水平拉伸以填充其所在列的整个宽度以及垂直拉伸至相同大小?我试图添加flex-column flex-grow但只水平调整它们而不是垂直调整它们的大小。处理这个问题的最佳方法是什么?
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<main>
<div id="content-container" class="container">
<div class="row">
<div class="col-12">
<h2 class="display-5 text-center text-white text-uppercase">Portfolio</h2>
</div>
</div>
<div class="row">
<div class="col-md-4 d-flex align-items-stretch">
<div class="card ">
<img class="card-img-top" src=".../100px200/" alt="Card image cap">
<div class="card-footer">Featured</div>
</div>
</div>
<div class="col-md-4 d-flex align-items-stretch">
<div class="card ">
<img class="card-img-top" src=".../100px200/" alt="Card image …Run Code Online (Sandbox Code Playgroud)我不太确定这是否可行,但想检查一下。我有一个剃刀页面,它有几个不同的处理程序方法。在其中一些中,我返回了部分视图结果。
例子:
public class BoardMeetingsModel : PageModel
{
//ctor
//properties
public IActionResult OnGetFetchCreateMeetingPartial()
{
return Partial("_CreateMeetingPartial", new ManipulationDto());
}
}
Run Code Online (Sandbox Code Playgroud)
我的部分视图设置如下:
@using Models.ManipulationModels
@model ManipulationDto
Run Code Online (Sandbox Code Playgroud)
这是一个部分页面,所以我没有使用 @page 指令(部分页面被命名为_CreateMeetingPartial.cshtml。不过,当我传入 ManipulationModel 时,我遇到了以下错误
The model item passed into the ViewDataDictionary is of type 'Models.ManipulationDto', but this ViewDataDictionary instance requires a model item of type 'Pages.BoardMeetingsModel'.
Run Code Online (Sandbox Code Playgroud)
我不是在用我的剃须刀页面调用部分。我直接返回一个部分页面,因为我在 javascript 模式中使用返回的数据。甚至可以覆盖这种行为吗?默认情况下,它总是期望传入基础PageModel(即BoardMeetingsModel)。
我很惊讶,即使我明确地传递了一个存在的模型,局部视图仍然期待一个页面模型,而不是我为局部视图明确声明的模型。
我正在尝试取一个数字,将其转换为字符串并替换所有不是三元组的字符.
例如.如果我传入1222331我的替换方法应该返回222.我可以发现这种模式存在但我需要获取值并将其保存到字符串中以获得其他逻辑.我不想做一个for循环迭代这个字符串.
我有以下代码:
String first = Integer.toString(num1);
String x = first.replaceAll("^((?!([0-9])\\3{2})).*$","");
Run Code Online (Sandbox Code Playgroud)
但它也取代了三位数.我只需要它来替换其余的字符.我的方法有误吗?
我试图更好地了解 jwt 令牌的存储方式(id、访问、刷新)。添加 OpenIdConnect 时,您可以设置的选项之一是保存令牌。使用以下配置,每当用户登录时,都会生成 jwt 令牌(无需单独调用授权端点来检索令牌)。
.AddOpenIdConnect("Test", options => {
options.SaveTokens = true;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,它们保存在与 ClaimsPrincipal 一起返回的 AuthenticationProperties 集合中。您可以通过 HttpContext.GetTokenAsync 检索它们。
下面的例子:
var accessToken = await HttpContext.GetTokenAsync("access_token");
Run Code Online (Sandbox Code Playgroud)
我试图更多地了解这些值是如何存储和检索的。我知道 Claimsprincial 是与用户相关的身份/声明的集合。但身份验证属性到底是如何设置的呢?如何单独访问身份验证属性的集合?是否有一个类/接口可以用来直接访问类属性?我在 ClaimsPrincial 类中没有看到任何有关身份验证属性的内容。
另外,由于访问令牌存储在身份验证属性中,更新该值的唯一方法是重新身份验证(即要求用户再次登录)吗?我该如何更新该值?或者提取该值并将其存储在其他地方进行更新会更好吗?
我在让 FluentValidation 处理对象集合时遇到问题。我的控制器 POST 操作接受 IEnumerable 对象,如下所示。当我发布到一个采用单个EventInputDto且属性Url格式不正确的操作时,我的验证会成功进行。当我发布到 的集合时EventInputDto,它不起作用并且不进行验证。
如果我使用常规 MVC 属性(即必需/电子邮件),它们可以处理集合以及单个对象。我如何让它与 FluentValidation 一起使用?我不使用内部集合,所以我不确定为什么它不能按预期工作。
public async Task<IActionResult> CreateEventCollection([FromBody] IEnumerable<EventInputDto> events)
{
if (!ModelState.IsValid)
{
return UnprocessableEntity(ModelState); //does not work
}
}
Run Code Online (Sandbox Code Playgroud)
我的验证器是使用泛型设置的,因为我使用单独的模型进行输入和更新。
public class EventManipulationValidator<T> : AbstractValidator<T> where T : EventManipulationDto
{
public EventManipulationValidator()
{
RuleFor(manipulationDto => manipulationDto.Title).NotNull().WithMessage("Title cannot be blank")
.Length(1, 50);
RuleFor(manipulationDto => manipulationDto.Message).NotNull().WithMessage("Message cannot be blank")
.Length(1, 1000);
RuleFor(manipulationDto => manipulationDto.ScheduledTime).NotNull().WithMessage("Scheduled Time cannot be blank");
RuleFor(inputDto => inputDto.Url).Matches(@"https://.*windows\.net.*").WithMessage("The url must be valid …Run Code Online (Sandbox Code Playgroud) 我遇到了一个我似乎无法解决的问题。我正在使用 Razor Pages 并且有两个可以绑定的对象。
[BindProperty]
public MeetingMinuteInputDto MeetingToCreate { get; set; }
[BindProperty]
public MeetingMinuteUpdateDto MeetingToUpdate { get; set; }
Run Code Online (Sandbox Code Playgroud)
以上两个是单独的 dto,用于在我的数据库中创建/更新基本实体。我有两个单独的 dto,因为我只允许更新特定项目(以防止过度发布)。这两个类有Name,Date和Reminder。该MeetingMinuteUpdateDto只允许Date被改变。
该名称属性是必需的,不能为空。我在同一个页面/控制器中拥有两个对象的原因是因为我使用模态来创建/更新,我宁愿不创建多个页面来创建/编辑对象。
我有两种用户可以填写的表单 - 一种用于编辑,一种用于创建。每个都将值绑定到一个特定的对象(即创建表单将其发布的表单值绑定到MeetingMinuteInputDto)。
<div class="form-group">
<div class="col-md-10">
<label asp-for="MeetingToCreate.Name" class="control-label"></label>
<input asp-for="MeetingToCreate.Name" class="form-control" />
<span asp-validation-for="MeetingToCreate.Name" class="text-danger"></span>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
以上是我用于创建新会议的表单示例。我检查了一下,当提交表单时,只有MeetingMinuteInputDto值被绑定。另一个对象 ( MeetingMinuteUpdateDto) 的所有属性都为空值。
但是当我检查模型状态时,MVC 会在“Name”属性上抛出一个错误,指出它为空。我查看了模型状态的结果,有一个名为“Name”的键,它与任何未通过验证的对象无关。
如果我MeetingMinuteUpdateDto从页面中删除另一个对象(即我删除)并进行模型绑定,则一切正常。如何防止模型验证尝试验证与当前操作无关的对象?我希望 Create 操作仅验证创建对象,反之亦然。
我尝试这样做,TryValidateModel(MeetingToCreate)但这也为模型验证提供了错误。
注意:我不能只是将对象属性放在外面,因为我还有其他页面需要这样做,其中更新/创建对象有 10 多个共享/不共享的属性。
更新- …
我有一个问题,关于验证跨界上下文中实体的存在时的最佳实践是什么。这在 DDD 中是一种有效的方法吗?BC 本质上应该是独立的部署(即您不应该依赖于另一个可能不可用的 BC)。
我的项目中有 2 BC - 配料和食谱。该公司销售散装原料,但也销售使用上述原料的预先配置的食谱。现在这些是独立的 BC,每个都有自己的成分实体。
配方是一个聚合根,具有成分列表的子实体。在将某种成分添加到Recipe BC的成分列表之前,验证该成分是否存在于Ingredient BC中是否有意义?
成分只能通过成分 BC 进行修改,其中将发布事件,并且配方 BC 将订阅并更新其自己的成分以进行任何更改(即价格/名称)。为了使其有效,该成分必须是有效的。那么如何保持这些BC之间的一致性呢?我是否将域服务注入到配方 BC 中并在添加成分之前验证成分是否存在?我也在使用 CQRS,因此我可以将服务直接注入到处理程序中,而不是用于创建食谱的工厂(或者这是使用域服务的正确方法吗?)。
有点迷失在这一点上,如果这是一个合理的担忧。
我有一个关于比较器接口的问题.我的类下面实现了按长度排序字符串的接口,而不是按字符值排序的默认排序.
覆盖默认比较后,我习惯Arrays.sort()对字符串数组进行排序.即使我已经覆盖了默认方法,如果我使用Arrays.sort,它会调用默认的比较而不是我的重写方法.这是因为我明确地调用了超类方法吗?
另一个问题是初始化接口本身.我知道你不能初始化一个接口,而是初始化一个类对象(实现所述接口)来引用接口可用的方法.在这种情况下,当我初始化比较器时,Arrays.sort(strArr, new Ideone());排序正常工作.该方法如何知道我将它传递给比较器?我只初始化了一个类对象,并没有compare(ob1, ob2)明确地调用该方法.
即使我这样做Comparator x = new Ideone();,类对象如何简化为比较器对象?对此的任何解释都会有所帮助.
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone implements Comparator
{
static String ThirdGreatest(String[] strArr)
{
Arrays.sort(strArr);
//Arrays.sort(strArr, new Ideone());
for(String x: strArr)
{
System.out.println(x);
}
return strArr[strArr.length-3];
}
@Override
public int compare(Object s1, Object s2)
{
return (s1.toString().length() - s2.toString().length());
}
public static void …Run Code Online (Sandbox Code Playgroud) c# ×6
asp.net ×3
asp.net-mvc ×3
java ×3
cqrs ×2
razor-pages ×2
regex ×2
string ×2
arrays ×1
asp.net-core ×1
azure ×1
azure-devops ×1
bootstrap-4 ×1
css ×1
docker ×1
html ×1
inheritance ×1
nginx ×1
oauth ×1
razor ×1
sorting ×1