标签: attributerouting

请求的资源不支持http方法"PUT"

我在我的Web API(MVC 4)中使用AttributeRouting.

为什么这样做?

    [AcceptVerbs("PUT")]
    [PUT("api/v1/tokens/current")]
    public MemoryToken UpdateToken([FromBody] DeviceTokenViewModel viewModel)
    {...}
Run Code Online (Sandbox Code Playgroud)

这一个不是吗?

    [PUT("api/v1/tokens/current")]
    public MemoryToken UpdateToken([FromBody] DeviceTokenViewModel viewModel)
    {...}
Run Code Online (Sandbox Code Playgroud)

错误消息:请求的资源不支持http方法"PUT".为什么我必须明确接受PUT动词?

我只是感到困惑,因为与POST类似的东西工作正常(我不必指定接受的动词):

 [POST("api/v1/tokens")]
 public MemoryToken CreateToken()
 {...}
Run Code Online (Sandbox Code Playgroud)

从其他各种帖子我相信它与我的web.config中的设置有关.Web服务器部分目前看起来像这样:

<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  <add name="AttributeRouting" path="routes.axd" verb="*" type="AttributeRouting.Web.Logging.LogRoutesHandler, AttributeRouting.Web" />
</handlers>
Run Code Online (Sandbox Code Playgroud)

我尝试过删除WebDav和其他东西.但到目前为止没有任何工作(除非在注释中明确允许PUT动词).

哦,我正在使用Visual …

asp.net-web-api attributerouting

6
推荐指数
1
解决办法
9465
查看次数

MVC属性路由 - 使用GET和POST的默认控制器索引

我们有一个MVC 5.1项目,正在使用属性路由.一切都工作正常,除了默认页面上有登录表单.

[RoutePrefix("Home")] 
public class HomeController : BaseController
{
    [Route("~/")]
    [Route]
    [Route("Index")]
    [HttpGet]
    public ActionResult Index()
    {
        var model = new LoginViewModel();

        return View(model);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Index(String Username, String Password)
Run Code Online (Sandbox Code Playgroud)

表格通过GET罚款显示,但在POST后我们得到......

HTTP错误405.0 - 不允许的方法

由于使用了无效的方法(HTTP动词),因此无法显示您要查找的页面.

通常,默认路由将处理POST和GET罚款.

   routes.MapRoute(
        name: "Default",
       url: "{controller}/{action}/{id}/{dealerId}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
     );
Run Code Online (Sandbox Code Playgroud)

显然我在默认路由上的帖子的路由中遗漏了一些东西,因为其他页面上的后续帖子工作正常.

有没有人这样做过?

谢谢,

c# asp.net-mvc-routing attributerouting asp.net-mvc-5 asp.net-mvc-5.1

5
推荐指数
1
解决办法
8570
查看次数

MVC AttributeRoute似乎忽略了RoutePrefix并导致多个控制器错误中的匹配操作

我正在使用MVC属性路由(MVC 5.1.2)并遇到错误:

找到了与URL匹配的多种控制器类型.如果多个控制器上的属性路由与请求的URL匹配,则会发生这种情

请求已找到以下匹配的控制器类型:FFInfo.WebUI.Areas.Admin.Controllers.HomeController FFInfo.WebUI.Areas.Admin.Controllers.SectionController

这种情况只发生在我去的时候/Admin/Sections/,我不确定为什么因为只有一条路线可以匹配该URL,任何人都可以帮我弄清楚出了什么问题?请注意这个问题是5.1.2独有的,MVC 5.0工作正常.

基础控制器:

[RouteArea("Admin")]
public class BaseController : Controller
{
}
Run Code Online (Sandbox Code Playgroud)

家庭控制器:

[RoutePrefix("")]
[Route("{action}")]
public class HomeController : BaseController
{

    public ActionResult Index()
    {
    }

    public ActionResult Updates()
    {
    }

    [ChildActionOnly]
    public PartialViewResult GetUpdatesGrid()
    {
    }


    public ActionResult GetUpdates(JqGridRequest Request)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

部门控制器:

[RoutePrefix("Sections")]
[Route("{action}")]
public class SectionController : BaseController
{
    [Route]
    public ActionResult Sections()
    {
    }

    [ChildActionOnly]
    public PartialViewResult GetSectionsGrid()
    {
    }

    public ActionResult GetSections(JqGridRequest Request)
    {
    }

    public ActionResult AddSection() …
Run Code Online (Sandbox Code Playgroud)

attributerouting asp.net-mvc-5

5
推荐指数
1
解决办法
3917
查看次数

优化性能或属性路由和路由表

我正在使用asp.net mvc 4 web应用程序中的属性路由.它是一个单一的应用程序,支持15种不同的文化和20多种语言.结果,我的路由表非常大,超过3000条路由.这么多路由的主要原因是路由是按语言本地化的.这样做的后续效果是它导致路由查找速度慢,反过来导致网站性能不佳.

我正在寻找提高性能的方法.所以寻找提示.不幸的是,由于业务限制,我无法改变我的路由结构.我有这么多路由的主要原因是由于翻译 - 每种语言的路由表中都有一个条目.有什么办法可以避免这个吗

另外,我在路由表中注意到POST方法的条目 - 这是必需的吗?可以避免在POST的路由表中有条目吗?

是否存在可以包含的任何形式的缓存以避免路由表查找而是从内存中读取?

属性路由或一般路由的任何性能优化提示都非常好.

asp.net-mvc routing routes asp.net-mvc-4 attributerouting

5
推荐指数
1
解决办法
895
查看次数

如何从ASP MVC5中的属性路由获取路由名称

有谁知道如何从动作过滤器中的属性路由获取路由名称?

例如,我有一个控制器和属性路由,如下所示:

[HttpGet]
[CustomActionAttribute]
[Route("~/index", Name="IndexPage")]
public async Task<ActionResult> Index()
{
    //Controller logic
}
Run Code Online (Sandbox Code Playgroud)

是否可以在CustomActionAttribute中获取路由名称?

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    //Get the current route name here
}
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc routes attributerouting asp.net-mvc-5

5
推荐指数
1
解决办法
3782
查看次数

ASP.Net MVC 4 w/AttributeRouting和多个RoutePrefix属性

TL; DR

我需要一种方法来根据我的MVC应用程序中的用户属性,在生成URL时以编程方式选择选择哪个RoutePrefix

不是TL; DR

我有一个MVC 4应用程序(使用AttributeRouting NuGet包)

由于托管环境的要求,我必须为我的许多操作设置两条路由,以便托管环境可以具有不同的访问权限.

我通过装饰我的控制器来解决这个问题[RoutePrefix("full")] [RoutePrefix("lite)].允许通过/ full/{action}和/ lite/{action}访问每个操作方法.

这非常有效.

[RoutePrefix("full")]
[RoutePrefix("lite")]
public class ResultsController : BaseController
{
    // Can be accessed via /full/results/your-results and /lite/results/your-results and 
    [Route("results/your-results")]              
    public async Task<ActionResult> All()
    {
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,每个用户只应在其URL中使用full或lite,这取决于该用户的某些属性.

显然,当我使用RedirectToAction()@Html.ActionLink()它只会选择第一个可用的路线,并不会保留"正确"的前缀.

我想我可以覆盖该RedirectToAction()方法以及添加我自己的@Html.ActionLink()方法版本.

这将有效,但它将涉及一些讨厌的代码,我生成URL,因为我得到的是一个表示动作和控制器的字符串,但不是反映的类型.也可能有路由属性,例如在我的示例中,所以我将不得不复制许多内置代码的MVC.

对于我想解决的问题,有没有更好的解决方案?

c# asp.net-mvc asp.net-mvc-4 attributerouting

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

属性路由在MVC4中不起作用

Attribute RoutingMVC4申请中使用.我已设定路线[Route("test-{testParam1}-{testParam2}")].这里`{testParam2}'可能包含'test'这个词.例如,如果我输入如下的网址,

localhost:33333/test-temp-test-tempparam2
Run Code Online (Sandbox Code Playgroud)

这给了我404错误.在url中,这里{testParam2}有两个单词test tempparam2格式化为test-tempparam2.当test单词位于最后位置时{testParam2},它运行良好.这意味着如果网址像.../test-temp-tempParam2-test运行良好.但是下面给出错误..../test-temp-test-tempParam2.

以下是可能有帮助的代码......

[Route ("test-{testParam1}-{testParam2}")]
public ActionResult Foo (int testParam2) {...}
Run Code Online (Sandbox Code Playgroud)

现在尝试关注两个网址.

  1. localhost:(port)/test-temp-1

  2. localhost:(port)/test-test-temp-1

在我的情况下,第二个错误.在这种情况下第一参数被格式化为test-temptest temp.首先运行良好.

如何解决这个问题呢?

c# asp.net-mvc-routing asp.net-mvc-4 attributerouting

5
推荐指数
1
解决办法
990
查看次数

Url.Action 生成查询而不是参数 URL

这是控制器类。我只显示方法签名。

[Authorize]
[RoutePrefix("specification")]
[Route("{action=index}")]
public class SpecificationController : BaseController
{
    [HttpGet]
    [Route("~/specifications/{subcategoryID?}")]
    public ActionResult Index(int? subcategoryID);

    [HttpPost]
    [Route("get/{subcategoryID?}")]
    public JsonResult Get(int? subcategoryID);

    [HttpGet]
    [Route("~/specifications/reorder/{subcategoryID}")]
    public ActionResult Reorder(int subcategoryID);

    [HttpGet]
    [Route("new/{id?}")]
    public ActionResult New(int? id);

    [HttpGet]
    [Route("edit/{id?}")]
    public ActionResult Edit(int id);

    [HttpPost]
    [ValidateAntiForgeryToken]
    [Route("edit")]
    public JsonResult Edit(SpecificationJson specification);

    [HttpPost]
    [Route("moveup")]
    public JsonResult MoveUp(int specificationID);

    [HttpPost]
    [Route("movedown")]
    public JsonResult MoveDown(int specificationID);

    [HttpDelete]
    [Route]
    public ActionResult Delete(int id);
}
Run Code Online (Sandbox Code Playgroud)

问题是调用

@Url.Action("index", "specifications", new RouteValueDictionary() { { "subcategoryID", @subcategory.SubcategoryID } })

返回

/规格?子类别ID = …

asp.net-mvc attributerouting

5
推荐指数
1
解决办法
1769
查看次数

如何摆脱由 MVCAttribute 路由引起的这个错误?

我在约定路由旁边启用了 MVC 属性路由。每次运行应用程序时都会出现此错误。

“DefaultInlineConstraintResolver”类型的内联约束解析器无法解析以下内联约束:“字符串”。说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。

异常详细信息:System.InvalidOperationException:“DefaultInlineConstraintResolver”类型的内联约束解析器无法解析以下内联约束:“string”。

这是堆栈跟踪:

[InvalidOperationException异常:类型DefaultInlineConstraintResolver'的内联约束解算器无法解决以下内嵌约束:“字符串”]
System.Web.Mvc.Routing.InlineRouteTemplateParser.GetInlineConstraint(集团constraintGroup,布尔isOptional,IInlineConstraintResolver constraintResolver)389
系统.Web.Mvc.Routing.InlineRouteTemplateParser.ParseRouteTemplate(字符串routeTemplate,IDictionary的2 defaults, IDictionary2个约束,IInlineConstraintResolver constraintResolver)488
System.Web.Mvc.Routing.DirectRouteFactoryContext.CreateBuilder(字符串模板,IInlineConstraintResolver constraintResolver)308
System.Web.Mvc.Routing .DirectRouteFactoryContext.CreateBuilderInternal(字符串模板)+48
System.Web.Mvc.Routing.DirectRouteFactoryContext.CreateBuilder(String template) +44
System.Web.Mvc.RouteAttribute.System.Web.Mvc.Routing.IDirectRouteFactory.CreateRoute(DirectRouteFactoryContext context) +80
System.Web.Mvc.Routing。 DefaultDirectRouteProvider.CreateRouteEntry(String areaPrefix, String controllerPrefix, IDirectRouteFactory factory, IReadOnlyCollection 1 factory, IReadOnlyCollection 1 factory, IInlineConstraintResolverconstraintResolver) +188 System.Web.Mvc.Routing.DefaultDirectRouteProvider.GetDirectRoutes(ControllerDescriptor controllerOnlyConstraintProvider, IsolvRoute controllerOntrainResolver, Isolver controllerOnlyResolver, IReadOnlyCollection 1 ) +2341 actions, IInlineConstraintResolver constraintResolver, Boolean targetIsAction) +115
System.Web.Mvc.Routing.DefaultDirectRouteProvider.CreateRouteEntries(String areaPrefix, String controllerPrefix, IReadOnlyCollection
1 actions, IInlineConstraintResolver constraintResolver, Boolean targetIsAction) +155
System.Web.Mvc.Routing.DefaultDirectRouteProvider.GetActionDirectRoutes(ActionDescriptor actionDescriptor, IReadOnlyList

1 actionDescriptors, IInlineConstraintResolver constraintResolver) +245
System.Web.Mvc.Routing.AttributeRoutingMapper.AddRouteEntries(SubRouteCollection …

c# asp.net-mvc asp.net-mvc-routing attributerouting

5
推荐指数
1
解决办法
1263
查看次数

ASP Net Core 属性路由和双正斜杠

正如这里所指出的,在 URL 中使用双斜杠是有效的。

我有一个使用属性路由的 ASP Net Core 项目,一个GroupController用于处理Groups上的操作的控制器和一个用于PUTtingRulePart的组的操作,由其ImportId类型指定string

[Route("/api/[controller]")]
public class GroupController : ControllerBase
{
    [HttpPut("{groupImportId?}/ruleParts")]
    public async Task<IActionResult> PutRuleParts(string groupImportId, [FromBody]List<RulePartDto> ruleParts)
    {
        return null; //actual code ommitted for brevity
    }
}
Run Code Online (Sandbox Code Playgroud)

http://localhost/api/group/groupImportId/ruleParts预期的那样匹配的 URL 。

我希望 null groupImportIds,即 URLs likehttp://localhost/api/group//ruleParts会调用相同的操作,因为groupImportId路由参数已被标记为可选。但是,在尝试调用此 URL 时,出现 404 错误并且未命中该操作。

是否有可能匹配 ASP Net Core 中的空 URL 路径段?

c# attributerouting asp.net-core asp.net-core-webapi asp.net-core-routing

5
推荐指数
1
解决办法
3415
查看次数