2016-01-02 42 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'? –