我的控制器中有以下代码,它使用EF将记录保存到数据库。
[Route("api/abc/PostValues")]
public HttpResponseMessage PostValues(p_abc p_abc)
{
if (ModelState.IsValid)
{
db.p_abc.Add(p_abc);
db.SaveChanges();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, p_abc);
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = p_abc.p_abc_id }));
return response;
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
}
数据被写入数据库 但是在以下一行
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = p_abc.p_abc_id }));
我得到以下异常
System.ArgumentNullException was unhandled by user code
HResult=-2147467261
Message=Value cannot be null.
Parameter name: uriString
Source=System
ParamName=uriString
StackTrace:
at System.Uri..ctor(String uriString)
at App.Controllers.abcController.p_abc(p_abc p_abc) in c:\xxx\abcController.cs:line 127
at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
InnerException:
请告诉我如何修复此异常
答案 0 :(得分:0)
看起来您没有匹配数据的路线。
您的DefaultAPI路由不存在或者与您传递的ID不匹配。
因此,以下代码:Url.Link("DefaultApi", new { id = p_abc.p_abc_id })
返回null;
答案 1 :(得分:0)
Location response-header字段用于将收件人重定向到Request-URI以外的位置,以完成请求或标识新资源。对于201(已创建)响应,Location是请求创建的新资源的位置。对于3xx响应,位置应该应该指示服务器自动重定向到资源的首选URI。字段值由单个绝对URI组成。
所以你必须像这样改变你的代码。 在路由config.cs
routes.MapRoute(
name: "Default1",
url: "api/{controller}/{id}",
defaults: new { controller = "Employees", id = UrlParameter.Optional }
);
和你的帖子方法
public class EmployeesController : ApiController
{
public HttpResponseMessage POSTEmployee(Employee employee)
{
if (ModelState.IsValid)
{
_db.Employees.Add(employee);
_db.SaveChanges();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, employee);
response.Headers.Location = new Uri(Url.Link("Default1", new { Id = employee.Id }));
return response;
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}
}