Попробуйте следующее:
^-?0*(1?[0-9]{1,3}|20[0-4][0-9]|205[0-5])$
Регулярное выражение перед скобками совпадает с необязательным -
и любыми ведущими 0.
Первая часть в скобках (1?[0-9]{1,3}
) совпадает с 0-1999.
Вторая часть в скобках (20[0-4][0-9]
) соответствует 2000-2049.
Третья часть в скобках (205[0-5]
) соответствует 2050-2055 .
Основываясь на некоторых отзывах, можно выполнить следующее, добавив файл Startup.cs.
services.AddMvc(options => {
options.Filters.Add(new ERPFilter(Configuration));
}
URL может быть учтено в соответствии с приведенным выше пунктом для повышения производительности.
url = ...
services.AddMvc(options => {
options.Filters.Add(new ERPFilter(url));
}
Предоставить ответ на основе комментариев, предоставленных вчера другими пользователями. Само собой, рекомендуется добавить IOptions<T>
в ваши фильтры или любые другие объекты, которые требуют ввода данных конфигурации.
Вы можете добавить свои настройки ERP в свой файл appSettings.json, например, так:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"Erp": {
"Url": "https://localhost"
}
}
Чтобы добавить ваши настройки в зависимости, вы должны зарегистрировать их через ConfigureServices
, вы также заметите, что CompanyFilter
добавляется в IServiceCollection
через AddTransient
, это позволяет ServiceFilterAttribute
разрешить его на более поздней стадии и ввести любые зависимости, которые есть у фильтра.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.Configure<ErpSettings>(Configuration.GetSection("Erp"));
services.AddTransient<CompanyFilter>();
}
Чтобы применить фильтр к действию вашего контроллера, используйте ServiceFilterAttribute (Type) `
[HttpGet]
[ServiceFilter(typeof(CompanyFilter))]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { ViewBag.ERPUrl };
}
В приведенном выше коде вы увидите, что я возвращаю ViewBag.ERPUrl, это потому, что ваш ComapnyFilter
переопределил OnActionExecuting
, который выполняется до того, как будет вызвано действие, тогда как OnActionExecuted
вызывается после того, как ваше действие завершено, и до того, как ответ будет возвращен вызывающей стороне.
Вот как теперь выглядит CompanyFilter
, вы заметите, что конструктор теперь принимает IOptions<ErpSettings>
public class CompanyFilter : ActionFilterAttribute
{
private readonly ErpSettings erpSettings;
public CompanyFilter(IOptions<ErpSettings> erpSettings)
{
this.erpSettings= erpSettings.Value;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.Controller is Controller controller)
controller.ViewBag.ERPUrl = erpSettings.Url;
}
}
После всего этого, это ответ
Я бы предложил вам использовать IOptions<T>
для получения конфигурации из файла со всеми преимуществами, поддерживаемыми .Net Core. Вы можете увидеть, как это сделать здесь .
Кроме того, чтобы добавить его в распознаватель инъекций зависимостей, добавьте services.AddTransient(p => new MyService(mySettings));
к вашей функции ConfigureServices()
в качестве переходного процесса или области действия или синглтона (решите, какой из них вам больше подходит).
Если вы настаиваете на использовании IConfiguration
для получения конфигурации и решения возникшей проблемы, вам следует внедрить свой экземпляр IConfiguration
следующим образом services.AddSingleton(Configuration);
. Надеюсь, что это решит вашу проблему.