4

ASP.NET Web API を使用して Web API の作成に取り組んでいます。現在、エンドポイントの機能をスタブ化して、それに対して開発を開始できるようにしています。

私の WebApiConfig.cs ファイルは次のようになります。

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

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

私の UsersController.cs ファイルには、次のメソッドがあります。

//Maps to /Users endpoint
[HttpGet]
public IEnumerable<User> GetAllUsers()
{
   //Code
}

//Maps to /Users/{id} endpoint
[HttpGet]
public User GetUser(int id)
{
   //Code
}

//Maps to /Users/{id}/Enrollments endpoint
[HttpGet, ActionName("Enrollments")]
public IEnumerable<Enrollment> GetUserEnrollments(int id)
{
   //Code
}

//Maps to /Users/{id}/Enrollments/{id}
[HttpGet, ActionName("Enrollments")]
public IEnumerable<Enrollment> GetUserEnrollment(int userid, int id)
{
   //Code
}

/Users/GetUser有効なルートにならないようにするにはどうすればよいですか?

[NonAction]onを使用GetUser(int id)すると、完全に機能しなくなります。

編集:これが現在の出力です/Users/GetUser

<Error>
    <Message>An error has occurred.</Message>
    <ExceptionMessage>
        Multiple actions were found that match the request: Byui.ILearnAPI2.Business.Entities.User GetUser(Int32) on type Byui.ILearnAPI2.API.Controllers.UsersController System.Collections.Generic.IEnumerable`1[System.String] GetUserEnrollments(Int32) on type Byui.ILearnAPI2.API.Controllers.UsersController
    </ExceptionMessage>
    <ExceptionType>System.InvalidOperationException</ExceptionType>
    <StackTrace>
at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext) at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage request, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    </StackTrace>
</Error>
4

5 に答える 5

2

これを試して。

  1. コメントアウトGetUserEnrollments(int id)
  2. 電話/Users/GetUser- あなたは得るでしょう
  リクエストが無効です。
  パラメータ ディクショナリに、パラメータ 'id' の null エントリが含まれています
  メソッド 'so14610664.Models.User の null 非許容型 'System.Int32'
  「so14610664.Controllers.UsersController」の「GetUser(Int32)」。オプション
  パラメーターは、参照型、null 許容型であるか、または型として宣言されている必要があります。
  オプションのパラメーター。
  1. ここで呼び出し/User/abcdefgます。上記と同じメッセージが表示されます。 "The request is invalid..."

公開されているのではなく、とが有効な値ではないため、 と の後にGetUser何かをマップしようとして失敗しているということです。言い換えれば、それはあなたが忘れたと考えています。/Users/idGetUser"abcdefg"Int32id


AttributeRoutingパッケージを試してください。App_Start/RouteConfigこれは、MVC ルーティング ( のルート) および/または Web API ルーティング (実行していること - のルートApp_Start/WebApiConfig) の両方の上にあるパッケージです。

そのパッケージを使用して、ルート マッピングをコード サンプルの次のようなものに置き換えます。App_Start

//Maps to /Users endpoint
[HttpGet, GET("/Users")]
public IEnumerable<User> GetAllUsers()
{
   //Code
}

//Maps to /Users/{id} endpoint
[HttpGet, GET("/Users/{id)"]
public User GetUser(int id)
{
   //Code
}

//Maps to /Users/{id}/Enrollments endpoint
[HttpGet, GET("/Users/{id}/Enrollments")]
public IEnumerable<Enrollment> GetUserEnrollments(int id)
{
   //Code
}

//Maps to /Users/{userid}/Enrollments/{id}
[HttpGet, GET("/Users/{userid}/Enrollments/{id}")]
public IEnumerable<Enrollment> GetUserEnrollment(int userid, int id)
{
   //Code
}
于 2013-01-30T22:04:32.867 に答える
2

あなたの投稿をもう一度見直したところ、エラーを正しく見ていないと思います。

コントローラーの構成方法が原因で、あいまいなルートがあります。

リクエストに一致する複数のアクションが見つかりました:

Byui.ILearnAPI2.API.Controllers.UsersController型のGetUser(Int32)

Byui.ILearnAPI2.API.Controllers.UsersController型のGetUserEnrollments(Int32)

GetUser と GetUserEnrollments は同じルートを共有します。私が言えることから、GetUser に int や文字列などを渡すと、適切に解決する方法がわからないため、GetUser は機能しません。

問題を解決するために、デフォルトの前にルート構成を追加できます。

config.Routes.MapHttpRoute(
    name: "GetUsers",
    routeTemplate: "api/users/{id}",
    defaults: new { controller = "Users", action = "GetUser" }
);
于 2013-01-30T21:06:04.957 に答える
1

IHttpRouteConstraintを使用して、{id}が整数であるかどうかを確認し、ルートのルート制約を指定できます。

サンプルはここにあります。

于 2013-01-30T18:17:15.297 に答える
0

404を返送してくださいGetUsers。これは、それを処理するための安らかな方法です。

于 2013-01-30T18:15:36.113 に答える
0

提供された ID を検証するために、このようなことを行うことができます。Id が見つからない場合は、必要なコードを含むカスタム応答メッセージを返すことができます。

[HttpGet]
public User GetUser(int id)
{
    if (id > 0 && validIds.Contains(id))
    {
        //Go do something fun...
    }
    else
        throw new HttpResponseException(
            new HttpResponseMessage(HttpStatusCode.NotFound)
                {
                    ReasonPhrase = String.Format("A valid id is required. {0} is most definitely not a valid id.", id);
                }


  );

}

于 2013-01-30T20:35:46.547 に答える