在前面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,这可能是不可能的.
当我尝试在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)
我目前正试图通过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版.
在 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似乎是设置新端点的正确方法。但是,没有关于如何完成此操作的示例。
问题
如何在不执行原始路径的情况下更改请求路径?
我试过的
context.Response.Redirect("/Account/ChangePassword");. 这有效,但它首先执行用户请求的原始操作方法。这种行为违背了初衷。HttpContext.SetEndpoint,但没有可用的示例。在 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 中编写等效的代码。我如何做到这一点?
非常感谢您的帮助
我有以下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# ×5
asp.net ×2
asp.net-core ×2
asp.net-mvc ×2
.net ×1
.net-core ×1
code-metrics ×1
datatable ×1
url-routing ×1
vb.net ×1