我最近将 webapi 升级到 .NET 8。当我测试控制器时,ApiVersion 属性在 swagger 页面中不起作用。
[ApiVersion("1.0")]
[Route("v{version:apiVersion}/api/[controller]")]
[ApiController]
[Authorize]
public class SubscriptionController(ISubscriptionDataService subscriptionDataService,
IConfigurationService configurationService) : ControllerBase
Run Code Online (Sandbox Code Playgroud)
在 swagger 页面中,默认情况下不会填写版本,就像在 .NET 7 中一样。
以前,使用默认模板weatherforecast 控制器时,行为是默认填充的。
该控制器的代码如图所示。
[ApiVersion("1.0")]
[Route("v{version:apiVersion}/api/[controller]")]
[ApiController]
[Authorize]
public class WeatherForecastController : ControllerBase
Run Code Online (Sandbox Code Playgroud)
在 Program.cs 中,添加以下内容以执行版本控制。
private static void AddApiVersioning(IServiceCollection services)
{
services.AddApiVersioning(options =>
{
options.AssumeDefaultVersionWhenUnspecified = false;
options.ReportApiVersions = false;
});
services.AddVersionedApiExplorer(options =>
{
options.GroupNameFormat = "'v'VVV";
options.SubstituteApiVersionInUrl = true;
});
}
Run Code Online (Sandbox Code Playgroud)
编辑1
由于以下弃用,完成此操作的方式需要更改。
Microsoft.AspNetCore.Mvc.Versioning -> Asp.Versioning.Mvc Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer -> Asp.Versioning.Mvc.ApiExplore
在Program.cs中,需要完成以下操作:
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddApiVersioning(options …Run Code Online (Sandbox Code Playgroud) 我希望通过一些增强功能实现与此问题非常相似的功能.
有一个ASP.NET MVC Web应用程序.
我有一个实体树.
例如,一个Page具有名为Children的属性的类,它是类型的IList<Page>.(Page类的实例对应于数据库中的行.)
请注意,网站所有者可以随时添加新页面,也可以删除现有页面,并且URL也应反映这些更改.
我想Page为数据库中的每个人分配一个唯一的URL .
我Page使用Controller调用对象PageController.
示例网址:
http://mysite.com/Page1/
http://mysite.com/Page1/SubPage/
http://mysite.com/Page/ChildPage/GrandChildPage/
Run Code Online (Sandbox Code Playgroud)
你得到了照片.
所以,我希望每个Page对象都有自己的URL,该URL等于其父URL和自己的名称.
除此之外,我还希望能够将单个映射Page到/(根)URL.
我想应用这些规则:
PageController该类我也发现了这个问题,并且也这一个和这一个,但他们有很大帮助没有,因为它们不提供有关我的头两个点的说明.
我看到以下可能的消息:
{*path}并编写一个IRouteHandler处理它的自定义,但我看不出我怎么能处理前两个规则,因为这个处理程序将处理所有事情.到目前为止,第一个解决方案似乎是正确的解决方案,因为它也是最简单的解决方案.但是,即使在那种情况下,我也不确定如何PageController处理请求.
我真的很感激你对此的看法.
先感谢您!
编辑:我现在有时间检查我收到的每个答案的每个方面.我接受了尼尔的回答,因为他是一个提供关于事情如何运作的最佳解释的人.我还提出了所有其他答案,因为它们提供了很好的想法.
我有这样的路线:
routes.MapPageRoute("Survey", "Survey", "~/Survey/Survey.aspx")
routes.MapPageRoute("Letters", "About/Letters", "~/Pages/Letters/Letters.aspx")
Run Code Online (Sandbox Code Playgroud)
如何将这样的网址重定向:/调查到"调查"路线?因此,当用户进入/调查时,它会重定向到/ Survey.(为了论证而使用的URL)
如果我不必在ASPX文件本身中放置重定向代码,而不是仅仅在路由规则中包含代码,那么我更喜欢它,只是保持简单和集中.
谢谢
卢克
注意:下面只是一个小型的演示排序来模拟我要找的东西:
以下是我的应用程序上用户可以看到的网址格式
mydomain.com/cat/1 --display cat with id 1 |controller=Cat, action=DisplayDetails
mydomain.com/dog/2 --display dog with id 2 |controller=Dog, action=DisplayDetails
mydomain.com/cow/2 --display cow with id 3 |controller=Cow, action=DisplayDetails
Run Code Online (Sandbox Code Playgroud)
我维持了一个系统,其中没有2只动物(可能是不同类型的)可以具有相同的id,这意味着如果有一只id = 1的猫,我们不能拥有任何其他具有该id的动物.同样来自我的系统,我可以从动物ID中提取动物细节+类型
除了现有的网址格式,我打算以下面的格式创建一个简短的网址
mydomain.com/1 --this will show cat
mydomain.com/2 --this will show dog
mydomain.com/3 --this will show cow
Run Code Online (Sandbox Code Playgroud)
我创建的路由如下所示,它们在global.asax中显示相同的顺序
pattern= Cat/{id}, controller= Cat, action=DisplayDetails
pattern= Dog/{id}, controller= Dog, action=DisplayDetails
pattern= Cow/{id}, controller= Cow, action=DisplayDetails
pattern= {id}, controller= DisplayAnyAnimal ----------i want help in this Route
Run Code Online (Sandbox Code Playgroud)
目前Controller看起来像这样
public class DisplayAnyAnimalContoller : Controller
{
public …Run Code Online (Sandbox Code Playgroud) 我使用路由设置了一个asp.net web api项目(它与Mvc项目完全相同) - 因此我有以下内容
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
所以一切都按照我想要的方式工作....我输入api/Products/15它到达我的产品控制器,传入15作为id.
大.
我还有2个控制器,1个叫做UploadsController,1个叫做DownloadController.这些提供上传和下载(GET/PUT等)
现在我不希望他们被原规则接受(见上文)
但我想要的是使用这两个网址来访问它们
/ api/Transport/Uploads/15/api/Transport/Downloads/15
我已经通过了15作为身份证,可能不会发生在现实生活中...只是它有利于示范:-)
现在运输不存在所以我可以做以下事情
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/Transports/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
我认为有效...
但问题是,如果我这样做
/ api/Uploads/15 - 这也会被我不想要的原始规则所捕获..
我希望通过虚假的"传输"访问上传和DOwnloads控制器,而不是没有传输
有人可以帮忙吗?
提前致谢
asp.net-mvc asp.net-routing asp.net-mvc-routing asp.net-web-api
我试图找出如何创建路由配置,以便所有URL都将转到相同的VIEW(页面).
当然,如果我这样做的话
/产品/编号
然后,这将在Products控制器中查找.
无论URL是什么,我都想总是转到我的MainController和相同的动作
这可能吗?
提前致谢
使用新的MVC属性路由,我知道您可以Route为单个分配多个属性ActionResult,但我正在寻找在该RoutePrefix级别执行相同操作的方法.我有一个控制器,在每个动作中都应该可以通过三种途径访问:
/Games/{Title}/Characters/{Route}
/Books/{Title}/Characters/{Route}
/Cinema/{Title}/Characters/{Route}
我尝试了三个单独的RoutePrefix属性,但是我得到了错误Deuplace RoutePrefix attribute.如果我尝试使用以逗号分隔的列表,我会得到Best override method for does not contain a constructor that takes 3 arguments.
是否可以设置一个RoutePrefix所需的三个路径我的控制器?
我想知道如何在 Razor Pages (Page.cshtml) 中获取路由值。前任。
https://localhost:44320/AdminPanel/Admins
如果我使用 MVC,我会将这些数据作为
var controller = ViewContext.RouteData.Values["Controller"]; //AdminPanel
var action = ViewContext.RouteData.Values["Action"]; //Admins
Run Code Online (Sandbox Code Playgroud)
如何在 Razor Pages 中获取这些值?
对于任何试图获得它的人,您可以通过以下方式获得它:
var fullRoute = ViewContext.RouteData.Values["Page"]; // AdminPanel/Admin
Run Code Online (Sandbox Code Playgroud) asp.net-routing razor asp.net-core asp.net-core-2.0 razor-pages
使用 ASP.NET Core 我收到以下令牌(简化):
String token = "Z%2F3+3Q==";
Run Code Online (Sandbox Code Playgroud)
的/是使用编码%2F。我从使用 Angular 在客户端上调用的 URL 收到了令牌。
我尝试使用以下方法解码令牌:
HttpUtility.UrlDecode(token)
Run Code Online (Sandbox Code Playgroud)
或者
WebUtility.UrlDecode(token)
Run Code Online (Sandbox Code Playgroud)
在这两种情况下%2F,都由/我想要的+代替,但由我不想要的空格代替。
我如何解码字符串?
更新
客户端应用程序正在发送编码的令牌:
Z%2F3%2B3Q%3D%3D;
Run Code Online (Sandbox Code Playgroud)
但是,不知何故,似乎令牌在以下操作中:
[HttpPut("account/verify/{userId}/{token}")]
public async Task<IActionResult> VerityEmailAddress([FromRoute]AccountEmailVerifyModel model) {
}
Run Code Online (Sandbox Code Playgroud)
转化为:
Z%2F3+3Q==
Run Code Online (Sandbox Code Playgroud)
所以+和=被解码,但/不是。
asp.net-routing ×10
asp.net-mvc ×4
asp.net ×2
asp.net-core ×2
c# ×2
.net ×1
.net-8.0 ×1
razor ×1
razor-pages ×1
routing ×1
urlencode ×1
webforms ×1