小编Lio*_*ion的帖子

通过将useNewUrlParser设置为true,避免"当前URL字符串解析器已弃用"警告

我有一个数据库包装类,它建立与某些MongoDB实例的连接:

async connect(connectionString: string): Promise<void> {
        this.client = await MongoClient.connect(connectionString)
        this.db = this.client.db()
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个警告:

(node:4833)DeprecationWarning:不推荐使用当前的URL字符串解析器,将来的版本将删除它.要使用新的解析器,请将选项{useNewUrlParser:true}传递给MongoClient.connect.

connect()方法接受一个MongoClientOptions实例作为第二个参数.但它没有一个叫做的属性useNewUrlParser.我还尝试在连接字符串中设置这些属性,如下所示:mongodb://127.0.0.1/my-db?useNewUrlParser=true但它对这些警告没有影响.

那么如何设置useNewUrlParser删除这些警告?这对我很重要,因为脚本应该以cron身份运行,而这些警告会导致垃圾邮件垃圾邮件.

mongodb在版本中使用驱动程序3.1.0-beta4和相应的@types/mongodb3.0.18.它们都是最新的可用npm install.

解决方法

使用旧版本的mongodb驱动程序:

connect()

mongoose mongodb node.js express typescript

210
推荐指数
14
解决办法
22万
查看次数

在文件更改时重建Docker容器

为了运行ASP.NET Core应用程序,我生成了一个dockerfile,它构建应用程序并在容器中复制源代码,Git使用Jenkins获取该代码.所以在我的工作区中,我在dockerfile中执行以下操作:

WORKDIR /app
COPY src src
Run Code Online (Sandbox Code Playgroud)

虽然Jenkins使用Git正确更新主机上的文件,但Docker不会将此应用于我的图像.

我建立的基本脚本:

#!/bin/bash
imageName=xx:my-image
containerName=my-container

docker build -t $imageName -f Dockerfile  .

containerRunning=$(docker inspect --format="{{ .State.Running }}" $containerName 2> /dev/null)

if [ "$containerRunning" == "true" ]; then
        docker stop $containerName
        docker start $containerName
else
        docker run -d -p 5000:5000 --name $containerName $imageName
fi
Run Code Online (Sandbox Code Playgroud)

我尝试不同的东西像--rm--no-cache参数docker run,并停止/删除容器之前,新的一个是建立.我不确定我在这里做错了什么.似乎docker正在更新图像,因为调用COPY src src会导致图层ID并且没有缓存调用:

Step 6 : COPY src src
 ---> 382ef210d8fd
Run Code Online (Sandbox Code Playgroud)

更新容器的推荐方法是什么?

我的典型场景是:应用程序在Docker容器中的服务器上运行.现在部分应用程序已更新,例如通过修改文件.现在容器应该运行新版本.Docker似乎建议构建一个新的映像而不是修改现有的容器,所以我认为像我这样重建的一般方法是正确的,但实现中的一些细节必须得到改进.

git jenkins docker dockerfile asp.net-core

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

ASP.NET EntityFramework获取数据库名称

我使用以下教程使用MySQL创建了一个ASP.NET EF应用程序:http://www.asp.net/identity/overview/getting-started/aspnet-identity-using-mysql-storage-with-an-entityframework-mysql -provider它的工作但我不喜欢在MySqlInitializer类中设置我的数据库名称,在以下片段中称为myDatabaseName:

var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>(
        string.Format(
          "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{0}' AND table_name = '__MigrationHistory'",
          "myDatabaseName"));
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来动态地从DbContext获取数据库的名称,以便我只将数据库名称存储在连接字符串中,而不是第二次存储在MySqlInitializer中.但我找不到该名称的任何属性,无论是在DbContext还是在DbContext的Database-attribute中.

c# mysql asp.net entity-framework

24
推荐指数
2
解决办法
1万
查看次数

ASP.NET Core Identity在应用程序启动时添加自定义用户角色

在ASP.NET Core应用程序中,我想创建某些角色作为管理不同用户权限的基础.遗憾的是,文档告知详细说明如何使用自定义角色,例如在控制器/操作中,而不是如何创建它们.我发现我可以使用RoleManager<IdentityRole>此实例,当实例在应用程序中注册其定义的和ASP.NET Core身份时,会自动注入到控制器构造函数中.

这让我添加一个这样的自定义角色:

var testRole = new IdentityRole("TestRole");
if(!roleManager.RoleExistsAsync(testRole.Name).Result) {
    roleManager.CreateAsync(testRole);
}
Run Code Online (Sandbox Code Playgroud)

它在数据库中工作并创建角色.但是这种检查总是会在数据库上产生开销,调用特定的控制器/动作.所以我想在我的应用程序启动后检查一次,如果自定义角色存在并添加它们.ConfigureServicesStartup.cs中的方法似乎很适合.

但是:如何创建RoleManager<IdentityRole>类的实例呢?我想在这里使用最佳实践方法,而不是通过自己创建依赖实例来解决这个问题,这似乎会导致很多工作,因为它没有很好的文档化,并且肯定不会遵循最佳实践,因为ASP.NET Core正在使用依赖注入这样的事情(这在我的意见中也是合理的).

换句话说:我需要在控制器之外使用依赖注入.

c# user-roles asp.net-core-mvc asp.net-core

20
推荐指数
2
解决办法
1万
查看次数

更改ASP.NET Core中DateTime解析的默认格式

我在ASP.NET核心控制器中得到一个日期,如下所示:

public class MyController:Controller{
    public IActionResult Test(DateTime date) {

    }
}
Run Code Online (Sandbox Code Playgroud)

该框架能够解析日期,但只能以英文格式.当我通过04.12.2017作为日期参数时,我的意思是2017年12月4日.这将被解析为英文日期,所以我的日期对象获得2017年4月12日的价值.我尝试仅使用这篇文章添加德语,并且这个,但没有成功.

ASP.NET Core需要做什么才能以正确的德语格式自动解析日期?

更新 I尝试设置RequestLocalizationOptions

services.Configure<RequestLocalizationOptions>(opts =>
{
    var supportedCultures = new[]
    {
        new CultureInfo("de-DE"),
    };

    opts.DefaultRequestCulture = new RequestCulture("de-DE");
    // Formatting numbers, dates, etc.
    opts.SupportedCultures = supportedCultures;
    // UI strings that we have localized.
    opts.SupportedUICultures = supportedCultures;
});
Run Code Online (Sandbox Code Playgroud)

还是行不通.我打电话给example.com/Test?date=12.04.2017并在我的调试器中得到了这个:

public IActionResult Test(DateTime date) {
    string dateString = date.ToString("d"); // 04.12.2016
    string currentDateString = DateTime.Now.ToString("d"); // 14.01.2016
    return Ok();
}
Run Code Online (Sandbox Code Playgroud)

c# asp.net-core-mvc asp.net-core asp.net-core-1.0

19
推荐指数
4
解决办法
3万
查看次数

ASP.NET EF从未映射的类中删除了鉴别器列

我有一个我的内容模型:

class BaseModel {
    public virtual string Content{ get; set; }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

要仅显示数据,上面的模型就可以了.但我想添加编辑内容的功能.所以我需要为成员内容添加一个属性- 但这只应该在autor按下编辑按钮时发生,而不是在内容的常规视图中.

所以我创建了第二个继承BaseModel的模型,以便我可以用我的属性覆盖成员:

class EditableBaseModel : BaseModel {
    [UIHint("MyEditor"), AllowHtml]
    public override string Content{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但由于继承,EF会创建一个额外的列鉴别器.它包含类的类型作为字符串.在我的情况下,它始终是BaseModel,因为我总是将EditableBaseModel转换为BaseModel,然后将它保存到数据库,如下所示:

myBbContextInstance.BaseModels.Add(editableBaseModelInstance as EditableBaseModel);
Run Code Online (Sandbox Code Playgroud)

因此,鉴别器列是浪费空间,我想删除它.我发现这可以使用NotMapped属性来完成.但是当我尝试保存模型时,这将导致以下异常:

无法找到EntityType'EditableBaseModel'的映射和元数​​据信息.

似乎NotMapped属性将让EF知道存在从BaseModel继承的另一个类,但EF不会获得有关此类的任何信息.但那不是我想要的.我需要告诉EF:EditableBaseModel不应该关心它,因为它只适合我的视图,并且永远不会用于数据库.

我怎样才能做到这一点?我发现的唯一方法是手动将EditableBaseModel实例转换为BaseModel对象,如下所示:

public ActionResult Save(EditableBaseModel editableBaseModel) {
    var baseModel = new BaseModel() {
        Content = editableBaseModel.Content
        // ...
    };
    myDbContextInstance.BaseModels.Add(baseModel); …
Run Code Online (Sandbox Code Playgroud)

c# asp.net inheritance entity-framework entity-framework-mapping

14
推荐指数
2
解决办法
1689
查看次数

在ASP.NET Core中自动生成小写虚线路径

ASP.NET Core 默认使用类似http:// localhost:5000/DashboardSettings/Index的CamelCase-Routes .但我想使用小写路由,这些路由由破折号分隔:http:// localhost:5000/dashboard-settings/index它们更常见且一致,因为我的应用程序扩展了一个运行Wordpress的网站,该网站也有小写网址破折号.

我了解到我可以使用路由选项将URL更改为小写:

services.ConfigureRouting(setupAction => {
    setupAction.LowercaseUrls = true;
});
Run Code Online (Sandbox Code Playgroud)

这有效,但给了我网址没有任何分隔符,如http:// localhost:5000/dashboardsettings/index,这些分隔符很难读.我可以使用路由属性来定义自定义路由

[Route("dashboard-settings")]
class DashboardSettings:Controller {
    public IActionResult Index() {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

但这会导致额外的工作并且容易出错.我更喜欢一个自动解决方案,它搜索大写字符,在它们之前插入一个破折号并使大写字母小写.对于旧的ASP.NET来说,这不是一个大问题,但在ASP.NET Core上,我看不到如何处理这个问题的方向.

这是怎么做到这里的?我需要一些接口,我可以生成url(比如标记帮助器)并用dash-delimiters替换CamelCase.然后我需要另一种接口用于路由,以便将破折号分隔符URL转换回CamelCase,以便与我的控制器/动作名称正确匹配.

url routing asp.net-core-mvc asp.net-core

14
推荐指数
4
解决办法
4536
查看次数

在没有swarm的情况下限制Docker中的可用主机资源

我只是想在docker-compose文件中限制一些Docker容器的资源.原因很简单:主机上运行多个应用程序/服务.所以我想避免,单个容器可以使用例如所有内存,这会损害其他容器.

从我学到的文档中,可以使用这个来完成resources.但这已经超越了deploy.所以我必须编写我的docker-compose文件,如下例所示:

  php:
    image: php:7-fpm
    restart: always
    volumes:
      - ./www:/www
    deploy:
      resources:
        limits:
          memory: 512M
Run Code Online (Sandbox Code Playgroud)

这给了我警告:

警告:某些服务(php)使用'deploy'键,将被忽略.Compose不支持部署配置 - 用于docker stack deploy部署到群组.

这似乎是正确的:docker stats确认,容器能够使用来自主机的所有ram.

文件说:

指定与部署和运行服务相关的配置.这仅在使用docker stack deploy部署到swarm时生效,并且被docker-compose up和docker-compose run忽略.

但我不需要聚类.似乎没有其他方法可以使用docker composer文件来限制资源.为什么不能指定某种类型的memory标签,比如start-parameter docker run

例: docker run --memory=1g $imageName

这适用于单个容器.但是我不能使用它(至少在没有违反清晰的关注点的情况下),因为我需要使用两个不同的容器.

编辑:临时解决方法

我发现,我可以mem_limit在从版本3降级到版本2(放在version: '2'顶部)之后直接使用.但我们目前使用的是版本3.1,因此这不是一个长期的解决方案.文档说,这deploy.resources是v2标签的新替代品mem_limit.

有一天,版本2已被弃用.因此,对于最新版本,资源管理是不可能的,至少没有一个群体?对我来说似乎在恶化,不能相信这个......

linux docker docker-compose

14
推荐指数
2
解决办法
5049
查看次数

在ASP.NET MVC Core控制器的构造函数中设置ViewBag属性

我的主题有某种面包屑.控制器始终是类别.为了避免重复我自己,我想在控制器的构造函数中为所有操作设置它,如下所示:

class MyController:Controller{
    public MyController() {
        ViewBag.BreadcrumbCategory = "MyCategory";
    }
}
Run Code Online (Sandbox Code Playgroud)

当我ViewBag.BreadcrumbCategory在布局视图中访问时,它为null.在一个行动中它起作用:

class MyController:Controller{
    public IActionResult DoSomething() {
        ViewBag.BreadcrumbCategory = "MyCategory";
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道在构造函数中设置ViewBag属性是不可能的?在执行此工作的每个操作上调用函数将是令人烦恼且没有好的做法.在使用构造函数的另一个问题是一个被接受的answear,但正如我所说,这不起作用,至少对于ASP.NET Core.

asp.net asp.net-mvc razor asp.net-core-mvc asp.net-core

12
推荐指数
2
解决办法
5328
查看次数

在Angular2中继承从父模块​​到子模块的导入

我制作了一个像这里描述的Angular2应用程序.它有两个组件(A,B),由全局导入app.module.我的想法是,包含共享模块app.module,所以我不需要用冗余代码搞乱每个模块.我想以此为例FormsModule.所以在app.module我有

imports: [
    UniversalModule,
    CommonModule,
    FormsModule,
    AModule
    RouterModule.forRoot([])
],

exports: [FormsModule]
Run Code Online (Sandbox Code Playgroud)

但是在A模块中,我得到了异常Can't bind to 'ngModel' since it isn't a known property of 'select'.,这似乎是由于缺失造成的FormsModule.它只有在我FormsModule使用时导入每个子模块时才有效imports: [FormsModule].这正是我想要避免的.

根据这个问题,我试图导入AppModule子模块A.这不起作用,并给我例外Exception: Call to Node module failed with error: Error: Unexpected value 'undefined' imported by the module 'AModule'

如何继承子模块的导入?我也需要这个用于管道.

single-page-application angular2-modules angular

12
推荐指数
2
解决办法
1万
查看次数