小编ibe*_*dev的帖子

Unable to push nuGet packages to GitLab with dotnet CLI due to Unauthorized error

GitLab now supports nuget public and private feed repository. I've got a public project (e.g: https://gitlab.com/sunnyatticsoftware/sasw-test-support) I create an access token for my user with api and write_repository (e.g: AAABBBCCCDDD)

I create a group variable in my CI/CD: SASW_API_ACCESS_TOKEN: AAABBBCCCDDD. All normal.

Then I create the multi stage CI/CD script to build, pack and publish. When attempting to publish the nuGet package with the following: dotnet nuget push **/*.nupkg --source https://gitlab.com/api/v4/projects/17141695/packages/nuget/index.json --api-key AAABBBCCCDDD --skip-duplicate

I get the …

nuget-package gitlab gitlab-ci dotnet-cli

7
推荐指数
2
解决办法
3828
查看次数

从Visual Studio Online ERROR_FILE_IN_USE构建ASP.NET 5到Azure网站

我在Visual Studio Online的Git中创建了一个虚拟的Hello World ASP.NET 5(MVC 6)项目.我按照本文档中描述的步骤构建并部署到我的Azure网站中.

我花了好几次尝试,因为构建失败了,例如"无法恢复NuGet包"或不存在的www文件夹(我必须提交源代码控制以使其工作),但我得到了它的工作,应用程序启动并运行.

我需要帮助的问题是持续集成配置.在Visual Studio中,只要在我的主分支中签入,我就选择了CI触发器来构建/部署.这会正确触发尝试,但它会因此错误而一直失败.

Error Code: ERROR_FILE_IN_USE More Information: Web Deploy cannot modify the file 'AspNet.Loader.dll' on the destination because it is locked by an external process. In order to allow the publish operation to succeed, you may need to either restart your application to release the lock, or use the AppOffline rule handler for .Net applications on your next publish attempt.

如何解决这个问题呢?

谢谢.

PS:另外我不知道为什么在部署的Azure网站中我看不到日志.当我使用GitHub挂钩时,它用于显示所有失败/成功的部署.

通常在Azure应用程序>部署中的Azure中

continuous-integration azure tfsbuild azure-devops asp.net-core

6
推荐指数
1
解决办法
762
查看次数

使用操作约束时在MVC 6中使用Swagger的多个Api版本

希望有人尝试过与MVC 6和Swagger中的版本化API类似的东西,以显示有关不同版本的文档.

我在这个ASP.NET 5存储库中使用MVC 6中推荐的API版本.我所做的唯一改变是GetVersion方法从请求的自定义http头读取api版本:

//in VersionRangeValidator.cs
public static string GetVersion(HttpRequest request)
{
        //return request.Query["version"];
        if (!string.IsNullOrWhiteSpace(request.Headers[Constants.CommonRoutingDefinitions.ApiVersionSegmentName]))
        {
            return request.Headers[Constants.CommonRoutingDefinitions.ApiVersionSegmentName];
        }
        return Constants.CommonRoutingDefinitions.CurrentApiVersion;
 }
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的控制器:

[Route("api/[controller]")]
[Produces(Constants.MediaTypeNames.ApplicationJson)]
public class TagsController : Controller
{
    private readonly ITagService _tagService;

    public TagsController(ITagService tagService)
    {
        _tagService = tagService;
    }

    /// <summary>
    /// Version 1 by default
    /// </summary>
    /// <returns>All the tags</returns>
    [HttpGet]
    [Produces(typeof(IEnumerable<Tag>))]
    public IEnumerable<Tag> GetTags()
    {
        IEnumerable<Tag> tags = _tagService.GetTags();
        return tags;
    }

    /// <summary>
    /// Version 2
    /// </summary> …
Run Code Online (Sandbox Code Playgroud)

swagger swagger-ui asp.net-core-mvc api-versioning asp.net-core

6
推荐指数
1
解决办法
4991
查看次数

gitlab CI 上的 dotnet pack 或 nuget pack

我正在使用 GitLab,我需要创建一个.gitlab-ci.yml脚本来为生成 nuGet 包的项目运行持续集成管道。

我在寻找可靠的文档来回答这个问题时遇到了严重的问题:

我应该使用dotnet pack还是nuget pack

nuget.exe 不能作为命令使用,除非我的 CI 脚本下载它(我正在使用 GitLab,所以我必须添加一些东西.gitlab-ci.yml才能这样做)。我的理解是dotnet隐式使用nuget,所以不需要直接使用nuget。

dotnet pack 命令的问题是我无法引用 nuspec 文件,它只是被忽略了。

我试过

dotnet pack 'MyProject.Nuget/MyProject.Nuget.csproj' /p:NuspecFile='MyProject.Nuget/MyProject.NuGet.nuspec' /p:PackageVersion=$VERSION --output nupkgs
Run Code Online (Sandbox Code Playgroud)

任何有关最新版本(dotnet --version2.1.401)正确方法的可靠文档都将不胜感激,因为我无法创建包含多个 dll 的有效 nuGet 包。

更新:替代方案是:

nuget pack ./*NuGet/*.nuspec -Version $VERSION -OutputDirectory pepe -Prop Configuration=Release -NoDefaultExcludes -Verbosity detailed
Run Code Online (Sandbox Code Playgroud)

nuget gitlab-ci .net-core

6
推荐指数
1
解决办法
7994
查看次数

使用内存节点的 EventStore 集成测试

我想使用 www.eventstore.org 编写一些集成测试来测试我是否能够序列化一些域事件并将它们附加到流中,并检索它们并反序列化它们等。

我一直在试图找出人们通常是如何做到这一点的,我阅读了一些 Greg Young 关于不同方法的回答(有点过时):

  1. 每次执行集成测试时,我都可以生成不同的流,但我不想这样做,也不想用测试数据污染事件存储
  2. 我可以使用内存中的事件存储。

第二个选项似乎很理想,因为我可以简单地运行一个干净的事件存储,运行我的测试并在最后停止服务器,以便所有数据都消失了。

我已经看到可以使用参数运行事件存储服务器,--mem-db而不是在磁盘中保留任何内容。

问题是:如果运行集成测试的操作系统很可能没有安装事件存储二进制文件,因此在内存中没有真正的事件存储服务器可以运行,那么如何在运行集成测试时使用内存中事件存储?我不希望我的测试仅仅因为没有在执行测试的机器上安装和启动并运行事件存储而失败。

我知道市场上的一些数据库有一些 nuGet 包,其中包含生产中使用的相同数据库引擎,但作为内存数据库,因此机器上不需要“真实”服务器来运行测试。所有二进制文件都位于项目可用的 DLL 中。

我试图找到一些关于这样的东西是否可用于事件存储的答案。我读了一些关于某些嵌入式客户端 API 的评论,但我发现的文档不是很清楚。其他评论提到了一个叫做 MiniNode 的东西,但同样,线程假设太多,还没有找到关于它的内容或我如何用于我的测试的清晰描述。

总之,任何人都可以提供一个集成测试示例(如果可能,xUnit),其中IEventStoreConnection使用的是内存中事件存储,而根本没有安装事件存储?

更新 1:我尝试添加 nuGet 依赖项EventStore.Client.Embedded来使用它,以防万一它是我需要的。但它不支持 DotNetCore(标准 2.0),所以我不知道。然后我读了这个ClientAPI.NetCore 问题,有人建议采用不同的测试方法,即使用 Chocolatey 抓取EventStore代码,然后从代码中执行EventStore.ClusterNode(我会用--mem-db标志来做)。我不确定我是否喜欢这样,至少不会超过将 Docker 用于相同目的。我仍然想知道是否有替代方案?

更新 2由于我使用的是 gitlab,因此我通过启动一个事件存储服务(容器)来运行与事件存储的集成测试,该服务将在持续集成步骤结束后立即终止。

integration-tests:
  image: my-images-repo/my-gitlab-runner-dotnet-core:latest
  stage: integration-tests  
  services:
    # add event store service
    - eventstore/eventstore:release-4.1.1-hotfix1    
  variables:
    # event store service params testing with standard ports
    EVENTSTORE_INT_TCP_PORT: "1113"
    EVENTSTORE_EXT_TCP_PORT: "1113" …
Run Code Online (Sandbox Code Playgroud)

c# integration-testing in-memory asp.net-core eventstoredb

6
推荐指数
0
解决办法
758
查看次数

持续部署环境中的 dotnet 语义版本控制

我正在使用 GitLab 为我的 dotnet 核心应用程序和 netstandard 2.0 包配置语义版本控制。

在阅读了相当多的意见后,其中一些意见相互矛盾,这对我来说很清楚。语义版本应该类似于 M.m.P.B-abc123where

  • M 是主要版本
  • m 是次要版本
  • P 是补丁版本
  • B 是构建版本(可选)
  • -abc123是后缀(可选)以防我使用预发行版。它必须以字母开头

因此,以下软件包版本将是有效的:

  • 1.0.0
  • 1.0.1.20190301123
  • 1.0.1.20190301123-beta
  • 1.0.1-rc1

我的版本控制有以下 gitlab 脚本

#Stages
stages:
  - ci
  - pack

#Global variables
variables:
  GITLAB_RUNNER_DOTNET_CORE: mcr.microsoft.com/dotnet/core/sdk:2.2
  NUGET_REPOSITORY: $NEXUS_NUGET_REPOSITORY
  NUGET_API_KEY: $NEXUS_API_KEY
  NUGET_FOLDER_NAME: nupkgs

#Docker image
image: $GITLAB_RUNNER_DOTNET_CORE

#Jobs
ci:
  stage: ci
  script:
    - dotnet restore --no-cache --force
    - dotnet build --configuration Release
    - dotnet vstest *Tests/bin/Release/**/*Tests.dll

pack-beta-nuget:
  stage: pack
  script:
    - export VERSION_SUFFIX=beta$CI_PIPELINE_ID
    - dotnet pack *.sln …
Run Code Online (Sandbox Code Playgroud)

csproj semantic-versioning gitlab .net-core dotnet-cli

6
推荐指数
1
解决办法
2375
查看次数

如何在 ASP.NET Core 3.0 中的另一个程序集中使用控制器?

默认的 dotnet core 3 web api 模板假定控制器与 Startup.cs

如何让它知道不同程序集中的控制器?

我个人喜欢让我的解决方案更有层次,并且只取决于它需要依赖的东西

MyApp.Host --> MyApp.WebApi --> MyApp.Application --> MyApp.Domain
Run Code Online (Sandbox Code Playgroud)

因此,MyApp.Host我不希望对 MVC 框架有任何直接依赖(尽管我知道在 Dotnet Core 3 中这已经是隐式的)。控制器在MyApp.WebApi

asp.net-mvc asp.net-core-3.0

6
推荐指数
1
解决办法
2290
查看次数

涉及现有 Azure 服务总线主题和安全性时的 MassTransit 方法

我正在实现一个库,供事件的发布者和消费者通过 Azure 服务总线进行通信,我认为 MassTransit 可能是一个不错的选择。

我能够用它发布多个事件,并且如果我让 MassTransit 创建它需要的任何主题,并通过在消费者上仅指定我指定队列名称的 3 种事件类型的接收器端点,则可以让多个消费者毫无问题地接收它们。

消费者示例:

var busControl =
    Bus.Factory.CreateUsingAzureServiceBus(
        cfg =>
        {
            CreateAzureServiceBusHost(cfg, serviceBusUri, serviceBusKeyName, serviceBusKey);

            cfg.ReceiveEndpoint(queueName, endpoint =>
            {
                foreach (var eventDtoType in eventsTypes)
                {
                    var adapterType = typeof(EventHandlerAdapter<>).MakeGenericType(eventDtoType);
                    var resolvedType = sp.GetService(adapterType);
                    endpoint.Consumer(adapterType, type => resolvedType);
                }
            });
        });
Run Code Online (Sandbox Code Playgroud)

请注意,我将 an 指定为使用者,EventHandlerAdapterType<TEvent>因为我有一个适配器来从 MassTransit 中抽象事件处理程序。但这与这个问题无关。

发布者配置如下:

var busControl =
    Bus.Factory.CreateUsingAzureServiceBus(
        cfg =>
        {
            CreateAzureServiceBusHost(cfg, serviceBusUri, serviceBusKeyName, serviceBusKey);
        });
Run Code Online (Sandbox Code Playgroud)

问题是我需要使用这个与创建自己主题的系统集成的库,并且它具有安全性(只有某些应用程序可以发布到它,只有某些应用程序可以读取已发布到该主题的消息

因此,我需要为想要发布特定主题事件的发布者以及想要阅读特定主题的消费者创建一个令牌 sas。不过,令牌的创建超出了这个问题的范围。

我的解决方案尝试:我在Azure服务总线中准备以下场景: - 创建主题topic-attempt-one(启用分区,但不确定是否相关) …

masstransit azureservicebus azure-servicebus-queues azure-servicebus-topics azure-servicebus-subscriptions

6
推荐指数
0
解决办法
1922
查看次数

每个事件生产者一个主题 VS 在多个生产者消息传递架构之间共享一个主题

这是一个有点普遍的问题,因为它不仅适用于我的场景(使用 Azure 服务总线),而且适用于发布/订阅事件的上下文中的任何事件总线。

问题是:是否更倾向于拥有一个不能在生产者之间共享主题的架构/拓扑? 换句话说:每个事件生产者一个主题 VS 多个生产者共享一个主题?

我有一个明确的偏好:一个主题应该只由一个制作人拥有和访问,如果其他制作人。但我似乎是团队中唯一一个持这种观点的人,而其他人似乎“为简单起见”在不同事件制作者之间共享同一主题似乎没有任何问题,而且我无法在技术可行性方面真正争论。 .

我希望从更技术的角度找到有价值的答案和良好实践,因为我的推理是从更多业务/组织的角度出发,因为我来自 DDD 背景,而其他人则没有。

  • 主题是一对多通信的输出框(我将其解释为一个事件发布者,多个订阅者)
  • 一个主题可以处理不同类型的事件消息,只要它们以某种方式相关(当然这是非常相关的)
  • 在 DDD 中,有一个有界上下文的概念,我喜欢将微服务/模块视为实现这些有界上下文的一种方式。因此,即使其他一些服务“认为”他们想要发布相关内容并想要访问共享主题进行发布,我认为它们属于不同的有界上下文,并且应该有自己的主题。
  • 如果多个生产者确实属于同一个有界上下文,那么我认为只有一个服务(或基础模块)应该负责发布在有界上下文中发生的事件。
  • 一个生产者也有可能想要消费来自其他生产者的事件(它也是一个下标者)。生产者订阅相同的主题并且必须根据消息是由自己还是其他人生产来区分消息是没有意义的。

如您所见,从 DDD 的角度来看,需要在同一主题中发布的多个生产者会引发设计气味。我并不是说它不能完成,我试图从技术角度找出是否也应该避免它。

任何有这方面实践经验的人?

PS:有一个关于 Kafka 的类似问题,但我认为这与 Kafka 对发布者 - 订阅者使用不同的技术方法完全相同


更新 1:我不知道 NServiceBus,但我已经在 MassTransit 上工作了一些,当利用 MassTransit 的拓扑创建(这是唯一的方法 afaik)时,它不仅为每个生产者而且每个消息类型创建了不同的主题。

architecture event-bus message-bus azureservicebus azure-servicebus-topics

6
推荐指数
1
解决办法
305
查看次数

Ubuntu 上的 Docker 无法连接到本地主机,但可以连接到其 IP

我运行的是 Ubuntu 18.04

\n\n
$ uname -r\n5.3.0-46-generic\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经安装了docker

\n\n
$ docker --version\nDocker version 19.03.8, build afacb8b7f0\n
Run Code Online (Sandbox Code Playgroud)\n\n

我有一个简单的 docker 映像,它公开端口 80。生成它的 Dockerfile 是

\n\n
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1\nCOPY publish .\nEXPOSE 80\nENTRYPOINT ["dotnet", "SampleWebApp.dll"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我为此图像运行容器时,我可以看到以下内容:

\n\n
$ docker run myimage:latest -p 8080:80\ninfo: Microsoft.Hosting.Lifetime[0]\n      Now listening on: http://[::]:80\ninfo: Microsoft.Hosting.Lifetime[0]\n      Application started. Press Ctrl+C to shut down.\ninfo: Microsoft.Hosting.Lifetime[0]\n      Hosting environment: Production\ninfo: Microsoft.Hosting.Lifetime[0]\n      Content root path: /\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我看到容器正在运行:

\n\n
$ docker ps\nCONTAINER ID        IMAGE                                                                              COMMAND                  CREATED             STATUS              PORTS               NAMES\n6f5bea7b329d        registry.gitlab.com/whatever/myimage:latest   "dotnet SampleWebApp\xe2\x80\xa6"   4 …
Run Code Online (Sandbox Code Playgroud)

linux docker ubuntu-18.04

6
推荐指数
1
解决办法
5658
查看次数