2014-05-09 2 views
0

J'ai le code suivant dans mon contrôleur qui enregistre l'enregistrement dans la base de données en utilisant EF.System.ArgumentNullException n'a pas été gérée par le code utilisateur

[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); 
    } 
} 

Les données sont écrites dans le db bien.
Mais sur la ligne suivante

response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = p_abc.p_abc_id })); 

Je me exception suivante

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: 

S'il vous plaît laissez-moi savoir comment corriger cette exception

+0

Pouvez-vous vérifier que vous avez une entrée dans votre '' WebApiConfig.cs' pour DefaultApi'? Cela devrait ressembler à ceci: 'config.Routes.MapHttpRoute (" DefaultApi "," ... ' – McCee

Répondre

0

Le champ d'en-tête de réponse à la localisation est utilisé pour rediriger le destinataire vers un emplacement autre que l'URI de demande pour l'achèvement de la demande ou l'identification d'une nouvelle ressource. Pour les réponses 201 (Créé), l'emplacement correspond à la nouvelle ressource créée par la demande. Pour les réponses 3xx, l'emplacement DEVRAIT indiquer l'URI préférée du serveur pour la redirection automatique vers la ressource. La valeur du champ est constituée d'un seul URI absolu.

Vous devez donc changer votre code comme ceci. en cours de route config.cs

routes.MapRoute(
     name: "Default1", 
     url: "api/{controller}/{id}", 
     defaults: new { controller = "Employees", id = UrlParameter.Optional } 
    ); 

et dans votre méthode post

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

On dirait que vous avez pas de route pour correspondre aux données.

Votre route DefaultAPI n'existe pas ou ne correspond pas à l'ID que vous avez transmis. D'où le code suivant: Url.Link("DefaultApi", new { id = p_abc.p_abc_id }) renvoie null;

Questions connexes