WebAPI自定义路由给出了404

时间:2017-01-20 18:52:26

标签: c# asp.net-web-api asp.net-web-api-routing

在这个webAPI控制器中,Action PSWS返回404.它之前工作正常,但现在显示404.代码中没有任何更改,只有几个控制器,这些控制器与不同的实体相关。调试器只是没有抓住任何东西或者在断点处停下来,我已经在知识或资源方面尝试了一切,为什么它显示404,但没有任何作用。

我通过以下网址

访问此操作

http://localhost:43827/api/Pss/PSWS/cs/b3dc86d8-9b55-4c7e-95f3-7bab0908510d/ps/1eaaaa5e-dd32-4d29-9b85-16c1eb7890f4/pss/6af508be-c2ca-4d00-aeb4-dd87cabf72d4/quantity/4/SerialPrefix/FP_P/StartFrom/21-11-2017/Expires/21-11-2019

任何帮助或指针都将受到高度赞赏:)

namespace API.Controllers
{
    [RoutePrefix("api/Pss")]
    public class myEntityController : ApiController
    {
        private localEntities db = new localEntities();

        [HttpGet]
        [Route("")]
        // GET: api/myEntity
         public async Task<IHttpActionResult> GetmyEntity(){ return OK("OK")}

        [HttpGet]
        [Route("{keys:guid}")]
        // GET: api/myEntity/1f7dc74f-af14-428d-aa31-147628e965b2
        [ResponseType(typeof(myEntity))]
         public async Task<IHttpActionResult> GetmyEntity(Guid keys){ return OK("OK")}

        // PUT: api/myEntity/1f7dc74f-af14-428d-aa31-147628e965b2
        [HttpPut]
        [Route("{keys:guid}", Name = "PutmyEntity")]
        [ResponseType(typeof(void))]
        public async Task<IHttpActionResult> PutmyEntity(Guid keys){ return OK("OK")}

        // POST: api/myEntity
        [HttpPost]
        [Route("", Name = "PostmyEntity")]
        [ResponseType(typeof(myEntity))]
        public async Task<IHttpActionResult> PostmyEntity(Guid keys,myEntity entity){ return OK("OK")}

        [HttpGet]
        [Route("psws/cs/{cpKeys:guid}/ps/{prkKeys:guid}/pss/{prkSKeys:guid}/quantity/{quantity:int}/SerialPrefix/{_SerialPrefix:length(3,20)}/StartFrom/{start:DateTime}/Expires/{end:DateTime}"] 
        [ResponseType(typeof(JObject))]
        public IHttpActionResult PSWS(Guid cpKeys, Guid prkKeys, Guid prkSKeys, int quantity, string _SerialPrefix, DateTime start, DateTime end)         
        {
            return Ok("kill");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

Route Constraint Reference

处引用以下文档
  

警告

     

避免使用约束进行输入验证,因为这样做意味着   无效输入将导致 404(未找到)而不是 400   带有适当的错误消息。应该使用路径约束   消除类似路线之间的歧义,而不是验证a的输入   特别的路线。

表示,除非参数{start:DateTime}/Expires/{end:DateTime}是拼写错误,否则这些参数的约束可能会根据它们应为{start:datetime}/Expires/{end:datetime}的情况而不正确。

接下来,示例网址包含无效的不变文化日期。

  

警告

     

验证URL的路由约束可以转换为CLR类型   (例如intDateTime始终使用不变文化 - 他们   假设URL不可本地化。框架提供的路线   约束不会修改存储在路由值中的值。所有路线   从URL解析的值将存储为字符串。例如,   浮点路由约束将尝试将路由值转换为a   float,但转换后的值仅用于验证它   转换成浮动。

也就是说,基于约束的预期日期应遵循以下不变的文化格式,如yyyy-MM-ddyyyy-MM-dd h:mmtt

这意味着

...StartFrom/21-11-2017/Expires/21-11-2019

实际应该是

...StartFrom/2017-11-21/Expires/2019-11-21

答案 1 :(得分:0)

您的方法和网址在语法上是正确的。 StartFrom和Expires的DateTime参数值可能不正确,导致404.

DateTime解析将取决于系统配置dd / mm / yyyy与mm / dd / yyyy等等。

要验证,请将您的网址更改为有效范围内的月份和日期可互换的日期(例如1-1-2017),或者甚至更好地将参数类型更改为字符串并控制代码中的解析基于您期望的方式。 DateTime.Parse(&#34; DD / MM / YYYY&#34)