2016-01-02 43 views
1

在Asp.net Web api 2项目中使用ravenDb时遇到了一个奇怪的问题。我有一个名为“TasksController”的控制器,其路径为“api/tasks”。与此相对应,我在ravendb中还有一个任务集合,其中包含像“tasks/1000”这样的Ids。当您通过http-post创建新任务时,api会按预期创建新任务并重定向到“任务/ {id}”路线。但是因为新创建的任务的Id是“tasks/1029”,所以返回的重定向URL变成了“../api/tasks/tasks/1029”,这显然不存在。有什么建议吗?web api url与ravenDb Id格式冲突

代码 POST方法

[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); 

    } 

邮差 - 发布采购信息

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格式的,但如果我不加载相关文件的标准格式它真的很难去还是我只是不知道如何?

回答

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; 
} 
+0

由于瓦迪姆。标题是正确的,但是我认为问题仍然存在,例如Url.link会生成book/book/123。这更多是因为Ravndb比其他任何事情都重要。 - 欢呼 –

+0

您正在查看请求标题。 Url.Link撰写网址,我认为它与您的当前网址连接。您是否尝试使用“RedirectToRoute”或第二种解决方案?它是否完成相同的结果'http://localhost/Hoxro.Web.Api/api/tasks/tasks/1091'? –