将 POST 发送到具有已定义路由的函数时出错 - Web API 2

Error when send POST to a function with defined route - Web API 2

我的 Web 服务中有这个功能,它在我的 table TBLocalidade 和 SQL 服务器中添加了一个 'addlocalidade'。

[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 测试了它,可以在数据库中添加值, 但它 return 这条错误信息:

{"Message":"An error has occurred.","ExceptionMessage":"UrlHelper.Link must not return null.","ExceptionType":"System.InvalidOperationException","StackTrace":" em System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult1.Execute()\r\n em System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult1.ExecuteAsync(CancellationToken cancellationToken)\r\n em System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\r\n--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---\r\n em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n em System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()\r\n--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---\r\n em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n em System.Web.Http.Controllers.AuthenticationFilterResult.d__0.MoveNext()\r\n--- Fim do rastreamento de pilha do local anterior onde a exceção foi gerada ---\r\n em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n em System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()"}

谁能帮我解决这个错误?

这是因为 UrlHelper 没有足够的信息来使用基于约定的路由生成 link。

假设网络 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 }
        );
    }
}

在使用该路由生成 created at 响应时,您需要提供控制器名称。

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 用于生成 links 的路由属性。

//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) { ... }

并在 CreatedAtRoute 中使用它以正确生成 link

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