1

SQL Server의 테이블 TBLocalidade에 'addlocalidade'를 추가하는 기능이 웹 서비스에 있습니다. 내가 경로를 제거하면정의 된 경로가있는 함수에 POST를 보낼 때 오류가 발생했습니다. - 웹 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 가 null을 반환하지 않아야합니다", "예외 유형": "System.InvalidOperationException이이 오류 메시지를 반환 ","StackTrace ":" em System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult 1.Execute()\r\n em System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult 1.ExecuteAsync (취소 설명 : 취소 토큰) \ 012 \ em \ System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext() \ r \ n --- 로컬 앞 페이지로 가기 gerada --- \ 연구 \ n 그들을 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 작업) \ 연구 \ n은 그들을 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업)의 \ r \ n 그들 System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext() \ r \ n --- 로컬 앞쪽에 앞면을 로컬로 실행하십시오. gerada --- \ r \ n em System.Runtime .CompilerServices.TaskAwai ter.ThrowForNonSuccess (작업 작업)의 \ r \ n 그들을 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업) \ 연구 \ n은 그들을 System.Web.Http.Controllers.AuthenticationFilterResult.d__0.MoveNext() \ 연구 \ n을 --- FIM은 rastreamento 드 pilha 지역을합니까 전방 onde exceção FOI gerada --- \ 연구 \ n 그들을 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 작업) \ 연구 \ n은 그들을 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업 개) \ r \ n 엠 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext() "}

누구든지이 오류를 해결하는 데 도움을 줄 수 있습니까?

답변

2

컨벤션 기반 라우팅을 사용하여 UrlHelper에서 링크를 생성하기위한 정보가 충분하지 않기 때문입니다. 이 같은 웹 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 } 
     ); 
    } 
} 

. 그러나

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에서 사용