小编Shi*_*nga的帖子

如何在ASP.NET Core Web Api中完成版本控制

在前面asp.net web api,我实现DefaultHttpControllerSelector指定我希望请求如何定位我的控制器.我经常使用不同名称的不同控制器,但用于相同的过程.唯一的区别是一个版本的版本高于另一个版本.

例如,我可以有一个名为的控制器BookingV1Controller,用于处理服务的第一个版本.我也有BookingV2Controller,它旨在处理服务的第二版.然后,客户端应用程序将使用此URL向服务发出请求http://myservice.com/api/v2/booking/someaction?id=12.为了处理请求,我将提供一个自定义实现,DefaultHttpControllerSelector以根据请求的版本选择所需的控制器的相应版本.

但是,我似乎没有办法做到这一点ASP.NET Core.我到处搜索都无济于事.没有可以帮助的文档.

如果有人能在这里帮助我,我将不胜感激.谢谢.

更新 我还想知道如果在自定义标头中指定版本该怎么办.例如X-Version:v1

更新2

要求是不应在URL中公开服务的版本.如果没有版本,则服务返回有关如何添加版本的说明.如果请求的版本中没有请求的控制器,系统将搜索较低版本.如果它在任何较低版本中找到它,它就会使用它.这样做的原因是为了防止在所有版本上重复使用控制器.但是使用ASP.NET Core,这可能是不可能的.

c# asp.net asp.net-web-api asp.net-core

12
推荐指数
3
解决办法
9636
查看次数

计算代码度量标准时发生错误

问题说明

当我尝试在Visual Studio 2013中为c#项目运行代码度量标准时(Analyze - > Calculate Code Metrics for Solution)我收到以下错误:

"an error occurred while calculating code metrics"
Run Code Online (Sandbox Code Playgroud)

即使对于新创建的项目,也会发生此错误,因此它与某些参考问题无关.

为解决此问题,我以管理员身份执行了以下命令:

regsvr32 "C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\VsLangproj.olb"
Run Code Online (Sandbox Code Playgroud)

结论

  • 我已经验证在新安装的VS 2013(包含更新4的安装程序)上没有发生此问题,这意味着这可能与更新到"更新4"有关.

c# code-metrics visual-studio-2013

9
推荐指数
3
解决办法
6473
查看次数

如何引用System.Web.Optimization程序集的1.1.0.0版

我目前正试图通过nugget在我的MVC 4应用程序中使用一个名为Jquery-File-Upload的文件上传.此文件上载取决于System.Web.Optimization命名空间的工作.

我的应用程序不断抛出此错误:

错误9程序集'Backload,Version = 1.9.3.0,Culture = neutral,PublicKeyToken = 02eaf42ab375d363'使用'System.Web.Optimization,Version = 1.1.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35',其版本高于引用程序集'System.Web.Optimization,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'

我试着调整web.config

<dependentAssembly>
    <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

我仍然得到同样的信息.

我google了,发现链接要求Microsoft.AspNet.Web.Optimization通过nugget 安装,我做了,但没有解决问题.

请问如何添加System.Web.Optimization.dll的1.1.0.0版.

.net c# asp.net-mvc system.web.optimization

5
推荐指数
2
解决办法
9392
查看次数

在 .Net Core 3.1 中更改请求路径

在 3.0 之前,我可以通过访问 的HttpRequest属性HttpContext然后更改Path.

例如,要为需要更改密码的用户显示一个页面(无论用户打算访问哪个页面),我扩展了HttpContext

public static void ChangeDefaultPassword(this HttpContext context) 
=> context.Request.Path = "/Account/ChangePassword";
Run Code Online (Sandbox Code Playgroud)

这段代码将用户带入到 action 方法ChangePassword中,AccountController 而不执行用户打算访问的 action 方法。

然后进入dotnet core 3.1。

在3.1中,扩展方法改变了路径。但是,它从不执行 action 方法。它忽略更新的路径。

我知道这是由于路由的变化。现在可以使用扩展方法访问端点HttpContext.GetEndpoint()。还有一个扩展方法HttpContext.SetEndpoint似乎是设置新端点的正确方法。但是,没有关于如何完成此操作的示例。

问题

如何在不执行原始路径的情况下更改请求路径?

我试过的

  1. 我尝试改变路径。dotnet core 3.1 中的路由似乎忽略了 HttpRequest 路径值的值。
  2. 我尝试使用context.Response.Redirect("/Account/ChangePassword");. 这有效,但它首先执行用户请求的原始操作方法。这种行为违背了初衷。
  3. 我尝试使用扩展方法HttpContext.SetEndpoint,但没有可用的示例。

url-routing .net-core .net-core-3.1 asp.net-core-3.1

5
推荐指数
2
解决办法
5865
查看次数

在 ASP.NET Core 中获取控制器详细信息

在 ASP.NET 4.x 中,有一个ReflectedControllerDescriptor类驻留在System.Web.Mvc. 此类提供控制器的描述符。

在我以前的应用程序中,我曾经这样做过:

var controllerDescriptor = new ReflectedControllerDescriptor(controllerType);

var actions = (from a in controllerDescriptor.GetCanonicalActions()
              let authorize = (AuthorizeAttribute)a.GetCustomAttributes(typeof(AuthorizeAttribute), false).SingleOrDefault()
              select new ControllerNavigationItem
                 {
                    Action = a.ActionName,
                    Controller = a.ControllerDescriptor.ControllerName,
                    Text =a.ActionName.SeperateWords(),
                    Area = GetArea(typeNamespace),
                    Roles = authorize?.Roles.Split(',')
                 }).ToList();

return actions;
Run Code Online (Sandbox Code Playgroud)

问题是我在 ASP.NET Core 中找不到这个类的任何等价物。我遇到了IActionDescriptorCollectionProvider它似乎提供的细节有限。

问题

我的目标是在 ASP.NET Core 中编写等效的代码。我如何做到这一点?

非常感谢您的帮助

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

4
推荐指数
1
解决办法
5033
查看次数

使用转换后的VB转换为C#代码

我有以下VB代码:

Dim dt As DataTable = DAL.WMS_Collaboration_Fetch(0).Tables(0)

If dt.Rows.Count > 0 Then
    'Bind Dataset to Gridview
    Dim _WMS_CollaborationInfo As New WMS_CollaborationInfo
    With _WMS_CollaborationInfo
        .CollaborationName = dt.Rows(0).Item["CollaborationName").ToString
        .CollaborationID = dt.Rows(0).Item("CollaborationID").ToString
    End With
Run Code Online (Sandbox Code Playgroud)

将它转换为C#代码,如下所示:

DataTable dt = DAL.WMS_Collaboration_Fetch(0).Tables(0);

if (dt.Rows.Count > 0) {
    //Bind Dataset to Gridview
    WMS_CollaborationInfo _WMS_CollaborationInfo = new WMS_CollaborationInfo();
    {
        _WMS_CollaborationInfo.CollaborationName  = dt.Rows[0].Item["CollaborationName"].ToString;
        _WMS_CollaborationInfo.CollaborationID = dt.Rows[0].Item["CollaborationID"].ToString;
    }
Run Code Online (Sandbox Code Playgroud)

但是,我无法运行C#代码.在VB中,使用DataTable的表列只需传入列名即可访问(好吧,我对VB不太了解),例如"CollaborationID"in

dt.Rows(0).Item("CollaborationID").ToString
Run Code Online (Sandbox Code Playgroud)

请问使用DataTable从表中读取数据的C#等价物是什么?我只是说我如何重新编写我的C#代码以便它可以工作.

c# vb.net datatable

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