【问题标题】:web api url conflicting with the ravenDb Id formatweb api url 与 ravenDb Id 格式冲突
【发布时间】:2017-09-25 19:08:01
【问题描述】:

我在 Asp.net Web api 2 项目中使用 ravenDb 时遇到了一个奇怪的问题。我有一个名为“TasksController”的控制器,其路由为“api/tasks”。与此相对应,我的 ravendb 中也有一个任务集合,其 ID 为“tasks/1000”。当您通过 http-post 创建新任务时,api 会按预期创建新任务并重定向到“tasks/{id}”路由。但是,由于新创建的任务的 ID 是“tasks/1029”,因此返回的重定向 URL 变为“../api/tasks/tasks/1029”,这显然不存在。请问有什么建议吗?

代码 发布方法

    [HttpPost]
    [Route("")]
    public async Task<IHttpActionResult> Post([FromBody]Task task)
    {
        task.Notes.Add(DateTime.Now.ToString("F"));
        await _repositoryFactory.TaskRepository.SaveTask(task);
        await _repositoryFactory.SaveChanges();
        return Redirect(Url.Link("Get", new {id = task.Id}));

    }

获取

    [HttpGet]
    [Route("{id}", Name = "Get")]
    public async Task<IHttpActionResult> Get(string id)
    {
        var task = await _repositoryFactory.TaskRepository.GetById(id);
        return Ok(task);

    }

POSTMAN - 发布请求

POST /Hoxro.Web.Api/api/tasks/ HTTP/1.1
Host: localhost
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 86fba9d3-cfcc-4060-226b-1db0eb189c7a

{

  "priority": 1,
  "notes": [
    "02 January 2016 20:52:59"
  ],
  "linkedTasks": [],
  "createdOn": "02/01/2016",
  "assignedTo": "TaskTestUser",
  "matterIds": [],
  "createdBy": "TaskTestUser",
  "completionDate": null,
  "dueDate": null,
  "completed": false
}

结果 -

{
  "message": "No HTTP resource was found that matches the request URI 'http://localhost/Hoxro.Web.Api/api/tasks/tasks/1091'.",
  "messageDetail": "No action was found on the controller 'Tasks' that matches the name 'tasks'."
}

正确的结果应该是-http://localhost/Hoxro.Web.Api/api/tasks/1091

我知道这是因为 RavenDb Id 格式,但如果我不使用标准格式 加载相关文档真的很难或者我只是不知道如何?

【问题讨论】:

    标签: c# asp.net api ravendb


    【解决方案1】:

    如果你想重定向到命名路由,你可以使用RedirectToRoute 方法而不是手动生成重定向url。

    [HttpPost]
    [Route("")]
    public async Task<IHttpActionResult> Post([FromBody]Task task)
    {
        task.Notes.Add(DateTime.Now.ToString("F"));
        await _repositoryFactory.TaskRepository.SaveTask(task);
        await _repositoryFactory.SaveChanges();
        return RedirectToRoute("Get", new {id = task.Id});
    }
    

    web api overview 中也说明了“正确的方式”,其中 url 添加到响应标头:

    [Route("api/books")]
    public HttpResponseMessage Post(Book book)
    {
        // Validate and add book to database (not shown)
    
        var response = Request.CreateResponse(HttpStatusCode.Created);
    
        // Generate a link to the new book and set the Location header in the response.
        string uri = Url.Link("GetBookById", new { id = book.BookId });
        response.Headers.Location = new Uri(uri);
        return response;
    }
    

    【讨论】:

    • 谢谢瓦迪姆。标题是正确的,但是我认为问题仍然存在,例如 Url.link 将产生 book/book/123 。这更多是因为 Ravndb。 -- 欢呼吧
    • 您正在查看请求标头。 Url.Link 构成 URL,我认为它与您当前的 url 连接。您是否尝试使用RedirectToRoute 或第二种解决方案?它是否以相同的结果“localhost/Hoxro.Web.Api/api/tasks/tasks/1091”完成?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2016-04-11
    • 1970-01-01
    • 2020-07-23
    • 2015-11-14
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多