将 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.CreatedAtRouteNegotiatedContentResult
1.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);
我的 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.CreatedAtRouteNegotiatedContentResult
1.Execute()\r\n em System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult
1.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);