2016-06-16 10 views
-1

私は、次のURLがあります:呼び出し元に対する複数のパラメータをWebAPIに渡すにはどうすればよいですか?

[HttpGet] 
[Route("api/values/{p1}/{p2}")] 
public HttpResponseMessage Get (string p1, string p2) { 
... 
} 

、それがWeb APIを打つことはありません:WebAPIのアプリValuesController

http://localhost/api/values/100/some+string+here 

を、私はこれを持っています。代わりに、404で返されます。

何が悪いと思いますか?

+0

と呼ばれていたことを確認することができました。 'Home'(あなたのApiControllerの名前が' HomeController'だった場合)のような適切なケースに入れられたコントローラ名に置き換えてみてください。 – Igor

+0

これをチェックする価値がありますhttp://stackoverflow.com/questions/12835074/mvc4-web-api-rest-interface-with-multiple-parameters – terbubbs

+1

私はあなたの問題を複製することはできません。私はWeb-API 2.2の最新バージョンを使用しようとしました。私はさまざまなWeb APIコントローラー名とあなたが投稿したものと全く同じURIとメソッドを使用していましたが、そのたびに値がヒットします。チェックするもの。あなたが定義したクラスが(APIではなく) 'ApiController'から継承していることを確認してください。 webapiconfig.csにデフォルトのルーティング設定を投稿します。起動時にWebApiConfig.csが初期化されていることを確認してください。 – Igor

答えて

1

Attribute Routing in ASP.NET Web API 2を使用しています。 MapHttpAttributeRoutesで属性ルーティングを使用するようにWeb APIを設定してください。次が作る

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Attribute routing. 
     config.MapHttpAttributeRoutes(); 

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

は確かにあなたのようなあなたの例では、あなたが最初のパラメータは整数になりたい場合は、適切

public class ValuesController : ApiController { 
    //GET api/values/100/some-string-here 
    [HttpGet] 
    [Route("api/values/{p1}/{p2}")] 
    public HttpResponseMessage Get (string p1, string p2) { 
    ... 
    } 
} 

あなたもまた

[RoutePrefix("api/values")] 
public class ValuesController : ApiController { 
    //GET api/values/100/some-string-here 
    [HttpGet] 
    [Route("{p1}/{p2}")] 
    public HttpResponseMessage Get (string p1, string p2) { 
    ... 
    } 
} 

RoutePrefixを使用することができ、あなたのコントローラを定義しました。ルート制約と更新メソッドを使用できます。

[RoutePrefix("api/values")] 
public class ValuesController : ApiController { 
    //GET api/values/100/some-string-here 
    [HttpGet] 
    [Route("{p1:int}/{p2}")] 
    public HttpResponseMessage Get (int p1, string p2) { 
    ... 
    } 
} 

UPDATE:

は値のコントローラの統合テストを作成し、それは `values`とは何かを持っているかもしれないアクションが

[TestMethod] 
public async Task HttpClient_Should_Get_OKStatus_From_Action_With_Multiple_Parameters() { 
    var config = new HttpConfiguration(); 
    config.MapHttpAttributeRoutes(); 

    using (var server = new HttpServer(config)) { 

     var client = new HttpClient(server); 

     string url = "http://localhost/api/values/100/some+string+here"; 

     using (var response = await client.GetAsync(url)) { 
      Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
     } 
    } 
} 
+0

あなたがRoutePrefexの砦を除いて、あなたが言及したすべてがWebAPIアプリで自動生成されます。 – 4thSpace

+0

必ずしもそうではありません。使用しているVisual Studioのバージョンによって異なります。 – Nkosi

+0

最初のパラメータは文字列です。 – 4thSpace

関連する問題