2017-03-13 7 views
2

私は2つのgetメソッドでasp.net webapiを作成しています。一方はすべてのレコードを返し、もう一方はcountrycodeという文字列パラメータに基づいてフィルタリングする必要があります。文字列パラメータの取得メソッドが呼び出されない理由はわかりません。Webapiメソッド呼び出されない文字列パラメータで取得する

私は、次のURIの

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

私のコード

ウェブ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")); 
     } 
    } 
次のことを試してみました

答えて

7

あなたはおそらくデフォルトの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 page on attribute routingをご覧ください。コメントを

編集:
あなたがルートで何とかそれらを区別する必要があるのと同じパラメータを持つ2つのルートを持っている場合。だから、チーム名による取得のあなたの例のために、私はおそらくこのような何かをするだろう:

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

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

あなたの他のメソッド名は、「取得」で、デフォルトのHTTPは、ルーティングはHTTP動詞と同じでメソッド名を探します属性。しかし、あなたはあなたの好きなものに名前をつけ、代わりに動詞でそれらを飾ることができます。

+0

こんにちはCraig、[Route( "{teamName}")]のような別のメソッドがある場合はどうすればいいですか? public HttpResponseMessage GetTeamName(string teamName)。どのように私のルートは、両方の文字列パラメータを取るようにGet要求をdeerenciate – Tom

+0

ちょっとトム、私は答えの最後にビットを追加しました。お役に立てれば。 –

+1

@CraigH - あなたは男です...ありがとう。 "これは、デフォルトルートのオプションのパラメータ名が 'id'であるためです。この行は私の人生を救った...私はすべてを正しくしたが、idセグメントの変数を私が使っていたものに変更するのを忘れた。 ありがとうもう一度.... –

関連する問題