1

私のWebサービスで、SQL ServerのテーブルTBLocalidadeにaddlocalidadeを追加するこの関数があります。定義済みのルートを持つ関数にPOSTを送信するときのエラー - Web API 2

[HttpPost] 
[Route("api/insertlocalidade")] 
[ResponseType(typeof(TBLocalidade))] 
public async Task<IHttpActionResult> insertlocalidade([FromBody] TBLocalidade addlocalidade) 
{ 
    objapi.Configuration.LazyLoadingEnabled = false; 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 
    objapi.TBLocalidade.Add(addlocalidade); 
    await objapi.SaveChangesAsync(); 

    return CreatedAtRoute("DefaultApi", new { id = addlocalidade.idLocalidade }, addlocalidade); 
} 

私はルートを削除した場合、それは完璧に動作しますが、私はこのルートを追加するとき:[Route("api/insertlocalidade")]、それは良い動作しません、私はデータベースに値を追加することが可能であった、httpRequesterでそれをテストしたが、

{ "メッセージ": "エラーが発生しました。"、 "ExceptionMessage": "UrlHelper.Link は ヌルを返してはならない"、 "ExceptionType": "System.InvalidOperationExceptionが、それは、このエラーメッセージを返します"、" StackTrace ":" em System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult 1.Execute()\r\n em System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult 1.ExecuteAsync(CancellationToken cancellationToken)\ 012 \ em \ System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\ r \ n --- ローカルのフロントエンドで行うことができます。 gerada --- \ Rの\ n個のEM System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)\ R \ nはEM System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)\ R \ nはEM System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()\ r \ n --- ローカルサーバー上のローカルサーバー上のファイルを実行する gerada --- \ r \ n em System.Runtime .CompilerServices.TaskAwai ter.ThrowForNonSuccess(タスク タスク)\ rを\ n個のem System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)\ rを\ n個のem System.Web.Http.Controllers.AuthenticationFilterResult.d__0.MoveNext()\ R \ nを--- FIMはrastreamentoデpilhaを行うには、地元の前部ONDE AexceçãoFOI gerada --- \ rをする\ n個のEM System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)\ rを\ n個のem を行いますSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)の\ r \ nのEM System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext() "}

誰でもこのエラーを解決するのを手伝ってもらえますか?

答えて

2

これは、コンベンショナルベースのルーティングを使用してリンクを生成するには、UrlHelperの情報が不十分であるためです。

あなたはそのルートを使用して応答で作成されたを生成する際にコントローラ名を提供する必要があるだろう...

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 } 
     ); 
    } 
} 

をこのようなWeb APIの設定を仮定。しかし

return CreatedAtRoute("DefaultApi", new { controller = "localidade", id = addlocalidade.idLocalidade }, addlocalidade); 

あなたがコントローラで、次のgetアクションを想定し、その後、ルーティング属性を使用しているので...

//GET api/localidade/5 
[HttpGet] 
[Route("api/localidade/{id:int}")] 
[ResponseType(typeof(TBLocalidade))] 
public async Task<IHttpActionResult> getlocalidade(int id) { ... } 

あなたがで使用されているルート属性にルート名を追加する必要がありますリンクを生成するUrlHelper

//GET api/localidade/5 
[HttpGet] 
[Route("api/localidade/{id:int}", Name="GetLocalidade")] // <-- NOTE THE CHANGE 
[ResponseType(typeof(TBLocalidade))] 
public async Task<IHttpActionResult> getlocalidade(int id) { ... } 

とリンク適切

return CreatedAtRoute("GetLocalidade", new { id = addlocalidade.idLocalidade }, addlocalidade); 
を生成するために CreatedAtRouteにそれを使用します
関連する問題