2016-03-29 16 views
3

私はすでに1つのWeb APIを設定して作業していますが、今では自分の管理パネル(私がやった)を設定しようとしています。 という名前のWeb APIのDeleteUser()機能が動作しているようです。私は、APIが存在するべきであるパスを与えている間に404エラーを得続けます。ASP.Net Web API 404エラー2番目のAPI

ウェブアピ設定:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

グローバル:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 

    //Create the custom role and user 
    RoleActions roleActions = new RoleActions(); 
    roleActions.AddUserAndRole(); 
} 

AdminAPIを:

[Authorize(Roles = "admin")] 
public class AdminApiController : ApiController 
{ 
    public string test() 
    { 
     return "test"; 
    } 

    [HttpPost] 
    public string DeleteUser(string id) 
    { 
     ApplicationDbContext db = new ApplicationDbContext(); 
     var user = db.Users.Find(id); 
     if (user != null) 
     { 
      string email = user.Email; 
      db.Users.Remove(user); 
      return "Succesfully deleted user : " + email; 
     } 
     else 
      return "Failed to delete user."; 
    } 
} 

アヤックス:

function deleteUser (id) 
{ 
    $.ajax({ 
     url: '../api/AdminApi/DeleteUser', 
     type: 'POST', 
     contentType: "application/json", 
     dataType: 'json', 
     data: JSON.stringify(id), 
     success: function (data) { 
      alert(data); 
     }, 
     error: function (x, y, z) { 
      alert(x + '\n' + y + '\n' + z); 
     } 
    }); 
} 

ajax関数はページ/ Admin/AdminPage で呼び出され、Web API - > ../api/AdminApi にアクセスし、ユーザーを削除する機能はDeleteUserです - > ../api/AdminApi/DeleterUser

404エラーが発生する理由はありません。私はそれをテストしていないので、私の関数DeleteUserが動作していないかどうかを理解することができますが、関数に入ることができない場合はテストできません。

+0

提案の削除操作は、 "HttpDelete"で削除する必要があります。 – TusharJ

答えて

1

問題は、属性を使用する方法に関連している:

[Route("DeleteUser")] 

あなたは属性ルートを使用している場合。あなたは、いくつかを宣言する場合

//GET api/customer/GetMetaData 
[Route('/api/customer/GetMetaData')] 
public string Get2(){ 
     //your code goes here 
} 

:それはどのように動作するかの例として

:メソッドレベルでどのようなことがないので、あなたがそれを使用するべき方法がある[Route('Url/path1/route1')]のように新しい経路以上のルートを定義することですあなたのクラスのルートはRoutePrefixのような属性を[RoutePrefix('url')]のように使用できます。これにより、Controllerクラスのすべてのメソッドの新しいベースURLが設定されます。例えば

:デフォルトのWeb APIによって

[RoutePrefix("api2/some")] 
public class SomeController : ApiController 
{ 
    // GET api2/some 
    [Route("")] 
    public IEnumerable<Some> Get() { ... } 

    // POST api2/some/DeleteUser/5 
    [HttpPost] 
    [Route("DeleteUser/{id:int}")] 
    public Some DeleteUser(int id) { ... } 

} 

更新

は私が意味する、あなたの[ルート]にあるもの最初のルーティングURL、を見て、それはあなたのポストに対してそれを一致させようとします。しかし、メソッドがパラメータとして複雑なオブジェクトを持っている場合、パラメータが複雑なタイプのためWebApiはリクエストURIから値を取得できません。Web APIはメディアタイプのフォーマッタを使用してリクエスト本体から値を読み取ります。

string idは複雑なオブジェクトではなく、Routeに属しているため、WebApiは本体ではなくURLの一部として使用します。代わりにこれを試してください:

[HttpPost] 
public string DeleteUser([FromBody]string anotherName) 
+0

@Dalorzoのために申し訳ありませんが、[Route( "DeleteUser")]は機能しなかった後の単なるテストで、投稿する前に削除するのを忘れていました。 – iamanoob

+0

あなたのコード 'DeleteUser([FromBody] string id)でこれを試してください。 ' – Dalorzo

+0

それは働いていました... [FromBody]が404エラーを修正する理由を私に説明できますか? PS:私の削除がうまくいかなかったように見えますが、気にしなくても「正常にユーザーを削除しました」が返されますが、まだページを更新すると表示されます。 – iamanoob

関連する問題