【问题标题】:WebAPI custom route gives 404WebAPI 自定义路由给出 404
【发布时间】:2017-06-05 20:21:36
【问题描述】:

在这个 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");
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

    Route Constraint Reference参考以下文档

    警告

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

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

    接下来,示例 URL 具有无效的固定文化日期。

    警告

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

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

    这意味着

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

    其实应该是

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

    【讨论】:

    • 谢谢,日期时间格式导致了这个问题。多谢 :)。是的,也使用了 DateTime 而不是 datetime。所以我更改了格式并删除了时间部分。现在它工作正常。
    【解决方案2】:

    您的方法和 URL 在语法上是正确的。 StartFrom 和 Expires 的 DateTime 参数的值可能是错误的,导致 404。

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

    要验证,请将您的 Url 更改为月份和日期在有效范围内可互换的日期(例如 1-1-2017),或者更好地将参数类型更改为 string 并控制根据您期望的方式解析代码。 DateTime.Parse("dd/MM/yyyy")

    【讨论】:

    • 确实问题出在日期时间上,如 Nkosi 回答所示。日期不是系统不变的文化格式。另一个问题是前端正在使用 2067-01-20T16:05:39.838 这种格式对其进行测试,除非“:”被认为是允许的,否则时间不会通过 url。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多