我使用ASP。NET核心为我的新的REST API项目后使用常规的ASP。NET Web API很多年了。我看不出在ASP中有什么处理异常的好方法。NET核心Web API。我尝试实现一个异常处理过滤器/属性:

public class ErrorHandlingFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        HandleExceptionAsync(context);
        context.ExceptionHandled = true;
    }

    private static void HandleExceptionAsync(ExceptionContext context)
    {
        var exception = context.Exception;

        if (exception is MyNotFoundException)
            SetExceptionResult(context, exception, HttpStatusCode.NotFound);
        else if (exception is MyUnauthorizedException)
            SetExceptionResult(context, exception, HttpStatusCode.Unauthorized);
        else if (exception is MyException)
            SetExceptionResult(context, exception, HttpStatusCode.BadRequest);
        else
            SetExceptionResult(context, exception, HttpStatusCode.InternalServerError);
    }

    private static void SetExceptionResult(
        ExceptionContext context, 
        Exception exception, 
        HttpStatusCode code)
    {
        context.Result = new JsonResult(new ApiResponse(exception))
        {
            StatusCode = (int)code
        };
    }
}

这是我的启动过滤器注册:

services.AddMvc(options =>
{
    options.Filters.Add(new AuthorizationFilter());
    options.Filters.Add(new ErrorHandlingFilter());
});

我遇到的问题是,当我的AuthorizationFilter发生异常时,它没有被ErrorHandlingFilter处理。我希望它能像以前的ASP一样被捕获。NET Web API。

那么我如何捕捉所有应用程序异常以及任何异常从动作过滤器?

在重新安装Visual Studio 2017后,我试图运行.NET核心Web项目,当我试图在Chrome上运行它时,我得到这个错误:

无法启动程序,当前操作不合法 状态

我知道对于旧版本的.NET,您可以通过以下方法确定是否安装了给定的版本

https://support.microsoft.com/en-us/kb/318785  

是否有官方的方法来确定是否安装了。net Core ?

(我不是说SDK,我想检查一个没有SDK的服务器,以确定它是否安装了DotNetCore.1.0.0-WindowsHosting.exe)

我能看到

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NET Cross-Platform Runtime Environment\.NET Framework 4.6\Win\v1-rc1 

在我的windows 7机器上使用1.0.11123.0版本#,但我在windows 10机器上没有看到相同的东西。

我正在按照文档创建初始迁移。当我执行dotnet时,我得到了帮助部分,这意味着PATH正常工作。

然后我尝试在控制台窗口的文档中执行下面的命令:

dotnet ef迁移添加InitialCreate

我得到以下错误:

无法执行,因为没有找到指定的命令或文件。 可能的原因包括:

内置dotnet命令拼写错误。 您打算执行。net Core程序,但dotnet-ef不存在。 您打算运行一个全局工具,但是在PATH上找不到带有此名称的dotnet前缀的可执行文件。 由于复制了命令,所以排除了第一项。 我排除了第二项,因为安装了包Microsoft.EntityFrameworkCore.SqlServer。 我排除了第三项,因为在调用dotnet时会得到帮助部分。

我在谷歌上搜索这个问题,但因为这个版本是新的,所以没有太多可以继续的东西,而且/或者它淹没在早期版本的类似问题中。

我试图强行安装微软。EntityFrameworkCore,以防需要显式地添加它。我遇到了错误消息,告诉我可以选择的最新版本是2.2.6,降级是不行的。我不确定如何安装与系统上已有的sql包兼容的版本(更不确定这是否是解决此问题的正确方法)。

检测到包降级:Microsoft。EntityFrameworkCore从3.0.0-preview6.19304.10到2.2.6。直接从项目中引用包以选择不同的版本。 Web - > Microsoft.EntityFrameworkCore.SqlServer 3.0.0-preview6.19304.10 -> Microsoft.EntityFrameworkCore.Relational 3.0.0-preview6.19304.10 -> 微软。EntityFrameworkCore (>= 3.0.0-preview6.19304.10) 微软。EntityFrameworkCore (>= 2.2.6)

我创建了一个。net核心MVC应用程序,并使用依赖注入和存储库模式将存储库注入到我的控制器。然而,我得到一个错误:

无法解析类型为“WebApplication1.Data”的服务。当试图激活“WebApplication1.Controllers.BlogController”。

存储库:

public interface IBloggerRepository { ... }

public class BloggerRepository : IBloggerRepository { ... }

控制器:

public class BlogController : Controller
{
    private readonly IBloggerRepository _repository;

    public BlogController(BloggerRepository repository)
    {
        _repository = repository;
    }

    public IActionResult Index() { ... }
}

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    
    services.AddScoped<IBloggerRepository, BloggerRepository>();
}

我不知道我哪里做错了。什么好主意吗?

我如何排序一个NumPy数组的第n列?

例如,给定:

a = array([[9, 2, 3],
           [4, 5, 6],
           [7, 0, 5]])

我想对a的行按第二列进行排序,得到:

array([[7, 0, 5],
       [9, 2, 3],
       [4, 5, 6]])

我拥有从同一接口派生的服务。

public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { } 
public class ServiceC : IService { }

通常情况下,其他IoC容器如Unity允许你通过一些区分它们的Key来注册具体的实现。

在ASP。NET Core,我如何注册这些服务,并在运行时根据一些关键字解析它们?

我没有看到任何接受键或名称参数的Add Service方法,这些参数通常用于区分具体实现。

    public void ConfigureServices(IServiceCollection services)
    {            
         // How do I register services of the same interface?            
    }


    public MyController:Controller
    {
       public void DoSomething(string key)
       { 
          // How do I resolve the service by key?
       }
    }

工厂模式是这里唯一的选择吗?

Update1 在这篇文章中,我已经展示了当我们有多个具体实现时,如何使用工厂模式来获取服务实例。然而,这仍然不是一个完整的解决方案。当我调用_serviceProvider.GetService()方法时,我不能将数据注入构造函数。

举个例子:

public class ServiceA : IService
{
     private string _efConnectionString;
     ServiceA(string efconnectionString)
     {
       _efConnecttionString = efConnectionString;
     } 
}

public class ServiceB : IService
{    
   private string _mongoConnectionString;
   public ServiceB(string mongoConnectionString)
   {
      _mongoConnectionString = mongoConnectionString;
   }
}

public class ServiceC : IService
{    
    private string _someOtherConnectionString
    public ServiceC(string someOtherConnectionString)
    {
      _someOtherConnectionString = someOtherConnectionString;
    }
}

_serviceProvider.GetService()如何注入适当的连接字符串? 在Unity或任何其他IoC库中,我们可以在类型注册时做到这一点。我可以使用IOption,但是,这将要求我注入所有设置。我无法向服务中注入特定的连接字符串。

还要注意,我试图避免使用其他容器(包括Unity),因为这样我就必须注册其他所有东西(例如,控制器)与新容器以及。

此外,使用工厂模式创建服务实例是不利于DIP的,因为它增加了客户端在这里有详细信息的依赖项数量。

所以,我认为默认DI在ASP。NET Core缺少两样东西:

使用键注册实例的能力 在注册期间向构造函数注入静态数据的能力

是否可以在Python中读取二进制MATLAB .mat文件?

我看到SciPy声称支持读取.mat文件,但我没有成功。我安装了SciPy 0.7.0版本,但找不到loadmat()方法。

是否有一种直接的方法将CSV文件的内容导入到记录数组中,就像R的read.table(), read.delim()和read.csv()将数据导入到R数据框架中一样?

或者我应该使用csv.reader(),然后应用numpy.core.records.fromrecords()?

我如何手动解析一个类型使用ASP。NET核心MVC内置依赖注入框架?

设置容器非常简单:

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddTransient<ISomeService, SomeConcreteService>();
}

但是如何在不执行注入的情况下解析ISomeService呢?例如,我想这样做:

ISomeService service = services.Resolve<ISomeService>();

在IServiceCollection中没有这样的方法。