2014-05-09 49 views
0

我在我的控制器中使用EF将记录保存到数据库中的代码如下。System.ArgumentNullException被用户代码未处理

[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

你能确认你有你'WebApiConfig.cs'为'DefaultApi'条目?它应该看起来像这样:'config.Routes.MapHttpRoute(“DefaultApi”,“...' – McCee

回答

0

位置响应头字段用于将接收方重定向到Request-URI以外的位置,以完成请求或识别新资源。对于201(已创建)响应,该位置是由请求创建的新资源的位置。对于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); 
     } 
    } 
} 
0

看起来。

您的DefaultAPI路由不存在,或者它与您传递的ID不匹配。 因此下面的代码:Url.Link("DefaultApi", new { id = p_abc.p_abc_id })返回null;

相关问题