2013-02-21 4 views
14

Ho un semplice controller Web API 4 su qualche codice del database legacy. L'entità come in questo modo:Parametro per il Post Web API 4 metodo nullo quando chiamato da Fiddler con JSON corpo

public class Employee 
{ 
    public string EmploymentStatus { get; set; } 
    public string CompanyCode { get; set; } 
    public string Division { get; set; } 
    public string OrgLevel1Code { get; set; } 
    public string OrgLevel2Code { get; set; } 
    public string OrgLevel3 { get; set; } 
    public string StoreName { get; set; } 
    public string EmployeeNumber { get; set; } 
    public string EmployeeFirstName { get; set; } 
    public string EmployeeMiddleInitial { get; set; } 
    public string EmployeeLastName { get; set; } 
    public string EmailAddress { get; set; } 
    public string JobCode { get; set; } 
    public string DateInJob { get; set; } 
    public string OriginalHire { get; set; } 
} 

Il metodo è simile al seguente:

public HttpResponseMessage PostEmployee(Employee item) 
    { 
     DataHelpers.AddUser(item.CompanyCode, item.Division, item.OrgLevel1Code, item.OrgLevel2Code, item.OrgLevel3, item.EmployeeFirstName, item.EmployeeMiddleInitial, item.EmployeeLastName, item.EmailAddress, item.JobCode, item.OriginalHire); 
     var response = Request.CreateResponse<Employee>(HttpStatusCode.Created, item); 
     string uri = Url.Link("DefaultApi", new { id = item.EmployeeNumber }); 
     response.Headers.Location = new Uri(uri); 
     return response; 
    } 

Quando ho post attraverso Fiddler in questo modo:

POST /api/identity HTTP/1.1 
User-Agent: Fiddler 
Host: localhost:1421 
Content-Length: 382 
contentType: "application/json; charset=utf-8" 
dataType: 'json' 

{ 
"employmentStatus":"zzz", 
"companyCode":"Titlemax", 
"division":"bbb", 
"orgLevel1Code":"ccc", 
"orgLevel2Code":"ddd", 
"orgLevel3":"eee", 
"storeName":"fff", 
"employeeNumber":"12343", 
"employeeFirstName":"Bill", 
"employeeMiddleInitial":"A", 
"employeeLastName":"sempf", 
"emailAddress":"[email protected]", 
"jobCode":"GM", 
"dateInJob":"8/7/2005", 
"originalHire":"8/7/2005" 
} 

ottengo un'eccezione .NET e il parametro item è nullo.

{"Message":"An error has occurred.","ExceptionMessage":"Object reference not set to an instance of an object.","ExceptionType":"System.NullReferenceException"} 

Che cosa mi manca? Sono nuovo dell'API Web. Grazie in anticipo.

+0

Si potrebbe eseguire il debug nel vostro metodo 'PostEmployee' per vedere quale codice linea di tiro questa eccezione? –

+1

Il parametro item è null. Quindi l'eccezione si verifica quando la faccio riferimento. –

risposta

29

Penso che sia il formato della richiesta in Fiddler. Provare a rimuovere le citazioni del Content-Type intestazione

Dalla scheda Compositore:

POST http://localhost:1421/api/identity HTTP/1.1 

intestazioni di richiesta:

User-Agent: Fiddler 
Host: localhost:1421 
Content-Type: application/json; charset=utf-8 

Richiesta Corpo:

{ 
    "employmentStatus":"zzz", 
    "companyCode":"Titlemax", 
    "division":"bbb", 
    "orgLevel1Code":"ccc", 
    "orgLevel2Code":"ddd", 
    "orgLevel3":"eee", 
    "storeName":"fff", 
    "employeeNumber":"12343", 
    "employeeFirstName":"Bill", 
    "employeeMiddleInitial":"A", 
    "employeeLastName":"sempf", 
    "emailAddress":"[email protected]", 
    "jobCode":"GM", 
    "dateInJob":"8/7/2005", 
    "originalHire":"8/7/2005" 
} 

Risposta:

HTTP/1.1 201 Created 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Location: http://localhost:1421/api/identity/12343 
Server: Microsoft-IIS/8.0 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?YzpcdXNlcnNcY2FsdmlfMDAwXGRvY3VtZW50c1x2aXN1YWwgc3R1ZGlvIDIwMTJcUHJvamVjdHNcTXZjQXBwbGljYXRpb24yXE12Y0FwcGxpY2F0aW9uMlxhcGlcaWRlbnRpdHk=?= 
X-Powered-By: ASP.NET 
Date: Thu, 21 Feb 2013 03:53:04 GMT 
Content-Length: 351 

{"EmploymentStatus":"zzz","CompanyCode":"Titlemax","Division":"bbb","OrgLevel1Code":"ccc","OrgLevel2Code":"ddd","OrgLevel3":"eee","StoreName":"fff","EmployeeNumber":"12343","EmployeeFirstName":"Bill","EmployeeMiddleInitial":"A","EmployeeLastName":"sempf","EmailAddress":"[email protected]","JobCode":"GM","DateInJob":"8/7/2005","OriginalHire":"8/7/2005"} 
+4

Ascolta qui i bambini - questo è un ammonimento su come, invecchiando, non puoi più lavorare per 16 ore al giorno. Grazie, Calvin - è esattamente così. Codice JavaScript usato nella mia intestazione. Ottieni il controllo verde perché hai fatto un PoC. –

3

La richiesta di intestazione violinista dovrebbe essere come questo:

Content-Type: application/json

+0

E per essere completamente chiaro - l'intestazione appare nella parte superiore della finestra di dialogo Fiddler Compose, proprio sotto le intestazioni "User-Agent" e "Content-Length" che Fiddler aggiunge automaticamente. Il corpo nella parte inferiore della finestra di dialogo Compose dovrebbe iniziare con il "{" del corpo JSON stesso. Questo è probabilmente ovvio per gli utenti di Fiddler più esperti, ma mi ci sono voluti un paio di volte per farlo bene. –