System.ArgumentNullException未被用户代码处理

时间:2014-05-09 00:03:56

标签: c# entity-framework asp.net-web-api

我的控制器中有以下代码,它使用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: 

请告诉我如何修复此异常

2 个答案:

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