2015-01-11 36 views
2

我正嘗試在我的Web API類中創建一個刪除功能。 我之前在使用Put和Patch Http消息時遇到了問題,因爲這些消息被鏈接到WebDAV。 更改後,修補程序和放置工作,但刪除給我的問題。WEB API 2刪除返回405

這裏是我的類:

[RoutePrefix("api/Account")] 
public class AccountController : ApiController 
{ 
    //private AuthRepository _repo = null; 
    Orchestrate.Net.Orchestrate orchestrate = new Orchestrate.Net.Orchestrate("0b42c04c-0d70-4da8-a3c1-2036882369d0"); 

[..rest of class here..] 

// DELETE: api/account/5 
[AllowAnonymous] 
[HttpDelete] 
public void Delete(string username) 
{ 
    orchestrate.Delete("users", username, true); 
} 

} 

我已經試過:

  • 幾種方法的不同變體通過使用一個int作爲標識,使用IHttpActionResult
  • 更改網頁刪除。 config
  • 在刪除方法本身上添加路由定義

當瀏覽網頁時,我發現很多人都遇到了Web.Config文件的問題,但是我的網頁似乎很好。這是大家都在談論的部分。

<system.webServer> 
    <modules> <remove name="WebDAVModule"/> </modules> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 
     <remove name="WebDAV" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    </system.webServer> 

這裏是我的要求:

DELETE http://localhost:41021/api/account/JoopSloop HTTP/1.1 
Host: localhost:41021 
Connection: keep-alive 
Accept: application/json, text/plain, */* 
Origin: http://localhost:48898 
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 
Authorization: Bearer -AqDRUMrrBNGICNUGIiSn0-gxTBUzElKupPPO9m1bCj0KHA9Z74vnOrPCxU-sTAWlfymTCDD3WGdFETC0-20zXOVSB7aStVHtCFrr-u9zogsUWfdiSicNzZQE3xrbyiFTB71GuwFjchx8xHIFI_6qHB26E2EKITwlFSi7X7p-lo6WWd4Z12SdL02ZxOI1wyZ8MQiXN47X6ZvuDKC6B_rJGQ2qh5p8pA8quZ0p8TvDLrPG6IuXv1U8jjS1iZCTVXO 
Referer: http://localhost:48898/ 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4 

的迴應是這樣的:

{"message":"The requested resource does not support http method 'DELETE'."} 

所以我開始到這裏很失望..

回答

0

添加以下到我的代碼,使其工作:

// DELETE: api/account/Janjaap/Admin 
    [Authorize] 
    [HttpDelete] 
    [Route("delete/{account}/{user}")] 
    public IHttpActionResult DeleteUser(string account, string user){ 
     //Do delete logic here 
     Return Ok(); 
    } 

我還沒有真正解決首次發行只是裝飾用的路由方法。我嘗試使用的初始路線是Route("/delete"),這也會導致問題。刪除第一個/是必須的。

1

你的控制器被稱爲AccountController和方法被稱爲'刪除' - 所以你不需要發送一個HTTP DELETE/api/account/d elete/JoopSloop爲了匹配請求到方法。

+0

寄來它'/ API /帳號/刪除/ JoopSloop'給我的'/ API /帳號/刪除/ JoopSloop' – VeldMuijz

+0

按下進入快速: 它發送到'/ API /帳號/刪除/ JoopSloop '給了我一個'http 404'。 將方法的第一個單詞設置爲HTTP動詞,我相信它會自動路由到該方法。如果你特別爲方法添加'[HttpDelete]'屬性,它應該匹配進入該方法的HTTP刪除消息。 我有一個'GetUsers'方法,具有'[HttpGet]'屬性,並且能夠通過/ get/api/Accounts上的httpget獲取用戶。 – VeldMuijz

5

也想添加另一種答案,有人告訴過我:

如果您的路由配置有這樣的:

config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

你的ID應該總是被稱爲ID,並且不能被命名爲別的東西:

這不起作用

//api/account/useridvalue 
[Authorize] 
[HttpDelete] 
public IHttpActionResult Delete(string whatEverYourNameis){ 
    //Do delete logic here 
    Return Ok(); 
} 

這確實

//api/account/useridvalue 
[Authorize] 
[HttpDelete] 
public IHttpActionResult Delete(string id){ 
    //Do delete logic here 
    Return Ok(); 
}