web-dev-qa-db-ja.com

WebApiメソッドGetwithstringパラメーターが呼び出されない

2つのgetメソッドを使用してasp.netwebapiを作成しています。 1つはすべてのレコードを返し、もう1つは国コードと呼ばれる文字列パラメータに基づいてフィルタリングする必要があります。文字列パラメータを指定したgetメソッドが呼び出されない理由がわかりません。

次のURIを試してみました

http://localhost:64389/api/team/'GB'
http://localhost:64389/api/team/GB

以下は私のコードです

Web API

public HttpResponseMessage Get()
        {
            var teams = _teamServices.GetTeam();
            if (teams != null)
            {
                var teamEntities = teams as List<TeamDto> ?? teams.ToList();
                if (teamEntities.Any())
                    return Request.CreateResponse(HttpStatusCode.OK, teamEntities);
            }
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Team not found");

        }

        public HttpResponseMessage Get(string countryCode)
        {
            if (countryCode != null)
            {

                var team = _teamServices.GetTeamById(countryCode);
                if (team != null)
                    return Request.CreateResponse(HttpStatusCode.OK, team);
            }

            throw new Exception();
        }

WebAPIConfig

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API routes
            config.MapHttpAttributeRoutes();

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

            config.Formatters.JsonFormatter.SupportedMediaTypes
            .Add(new MediaTypeHeaderValue("text/html"));
        }
    }
5
Tom

おそらく、デフォルトのAPIルートからデフォルトの「Get()」メソッドにアクセスしていると思います。
このようにメソッドでパラメーター名を「id」に変更した場合も機能すると思います。

public HttpResponseMessage Get(string id)

これは、デフォルトルートのオプションのパラメータ名が「id」であるためです。

属性ルーティングを機能させるには、以前にルート構成によって推測された値でコントローラーとメソッドを装飾する必要があります。
したがって、コントローラーの上部には、おそらく次のものがあります。

[RoutePrefix("api/team")]
public class TeamController : ApiController

次に、2番目のgetメソッドの上に:

[Route("{countryCode}")]
public HttpResponseMessage Get(string countryCode)

属性ルーティング以来、私は「古いスタイル」のルーティングを使用していません。
詳細については、 属性ルーティングに関するASP.NETページ を確認してください。

コメント用に編集:
同じパラメータを持つ2つのルートがある場合は、ルート内でそれらを何らかの方法で区別する必要があります。したがって、チーム名で取得する例として、私はおそらく次のようなことをします。

[HttpGet()]
[Route("byTeamName/{teamName}")]
public HttpResponseMessage GetByTeamName(string teamName)

Your url would then be /api/team/byTeamName/...

他のメソッド名は「Get」であり、デフォルトのHTTP属性ルーティングはHTTP動詞と同じメソッド名を検索します。ただし、メソッドに好きな名前を付けて、代わりに動詞で装飾することができます。

17
Craig H