2017-09-19 58 views
0

thisチュートリアルを使用してWeb APIを作成しています。私はこのAPIをPostmanで実行しています。 GET、PUT、DELETEメソッドは完璧に動作しますが、POSTメソッドを使用しようとすると動作しないため、例外が発生します。要求Web APIに一致する複数のアクションが見つかりましたasp.net

{ "Message": "An error has occurred.", "ExceptionMessage": "Multiple actions were found that match the request: \r\nPostProduct on type ProductStoreApi.Controllers.ProductController\r\nPostProducts on type ProductStoreApi.Controllers.ProductController", "ExceptionType": "System.InvalidOperationException", "StackTrace": " at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()" }

更新1

ポスト方法

public Product PostProduct(Product item) 
    { 
     item = repository.Add(item); 
     return item; 
    } 

    public HttpResponseMessage PostProducts(Product item) 
    { 
     item = repository.Add(item); 

     var response = Request.CreateResponse(HttpStatusCode.Created, item); 

     string uri = Url.Link("DefaultApi", new { id = item.Id }); 
     response.Headers.Location = new Uri(uri); 

     return response; 
    } 

注: - チュートリアルで両方の上記の方法、すなわちPostProduct同じ名前を持っています。しかし、私が同じ名前を書こうとすると、私はいつもエラーになります。

ルート

// Web API routes 
     config.MapHttpAttributeRoutes(); 

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

私はその上の多くの記事を検索しましたが、完璧な解決策を見つけることができませんでした。

ご協力いただければ幸いです。あなたはチュートリアルのPostProduct方法誤解している

+1

コントローラコードは表示できますか? –

+0

@MatJは質問を更新しました – faisal1208

+4

チュートリアルには「PostProduct」が1つしかありません。第2は単に最初のものへの更新です。 –

答えて

2

次に、我々は 新製品を作成するためにProductsControllerクラスにメソッドを追加します。ここでのコードは、明示的にこれがこの方法のない最終的な実装であることを警告することを

// Not the final implementation! 
public Product PostProduct(Product item) 
{ 
    item = repository.Add(item); 
    return item; 
} 

注:ここでは方法の簡単な実装です。

その後、我々が持っているチュートリアルで:

ASP.NETのWeb APIはHTTPレスポンスメッセージを操作することが容易になります。あなたがにある

public HttpResponseMessage PostProduct(Product item) 
{ 
    item = repository.Add(item); 
    var response = Request.CreateResponse<Product>(HttpStatusCode.Created, item); 

    string uri = Url.Link("DefaultApi", new { id = item.Id }); 
    response.Headers.Location = new Uri(uri); 
    return response; 
} 

(私の強調)

置き換えるこの改良の実装と以前PostProduct方法:ここで は改善実装です。

+0

はい、私はこのチュートリアルを理解していませんでした。 :) – faisal1208

関連する問題