2014-06-19 2 views
6

Ich versuche, diese JSON-Antwort mit einem Header Ihttpstatus, der Code 201 und behalten IHttpActionResult als meine Methode Rückgabetyp.Wie kann ich von einer IHttpActionResult-Methode eine benutzerdefinierte Variable zurückgeben?

JSON Ich möchte zurück:

{ "CustomerID": 324}

Meine Methode:

[Route("api/createcustomer")] 
[HttpPost] 
[ResponseType(typeof(Customer))] 
public IHttpActionResult CreateCustomer() 
{ 
    Customer NewCustomer = CustomerRepository.Add(); 
    return CreatedAtRoute<Customer>("DefaultApi", new controller="customercontroller", CustomerID = NewCustomer.ID }, NewCustomer); 
} 

JSON zurückgegeben:

"ID" : 324, "Datum": "201 4-06-18T17: 35: 07.8095813-07: 00" ,

Hier sind einige der Renditen, dass ich habe versucht, entweder gab ich null Fehler uri oder habe ich ähnlich das Beispiel oben eine Antwort .

return Created<Customer>(Request.RequestUri + NewCustomer.ID.ToString(), NewCustomer.ID.ToString()); 
return CreatedAtRoute<Customer>("DefaultApi", new { CustomerID = NewCustomer.ID }, NewCustomer); 

Mit einer Methode httpresponssemessage type kann dies wie folgt gelöst werden. Allerdings möchte ich eine IHttpActionResult verwenden:

public HttpResponseMessage CreateCustomer() 
{ 
    Customer NewCustomer = CustomerRepository.Add(); 
    return Request.CreateResponse(HttpStatusCode.Created, new { CustomerID = NewCustomer.ID }); 
} 

Antwort

9

Dies wird Ihnen Ihr Ergebnis:

[Route("api/createcustomer")] 
[HttpPost] 
//[ResponseType(typeof(Customer))] 
public IHttpActionResult CreateCustomer() 
{ 
    ... 
    string location = Request.RequestUri + "/" + NewCustomer.ID.ToString(); 
    return Created(location, new { CustomerId = NewCustomer.ID }); 
} 

Nun wird der ResponseType nicht überein. Wenn Sie dieses Attribut benötigen, müssen Sie einen neuen Rückgabetyp erstellen, anstatt einen anonymen Typ zu verwenden.

public class CreatedCustomerResponse 
{ 
    public int CustomerId { get; set; } 
} 

[Route("api/createcustomer")] 
[HttpPost] 
[ResponseType(typeof(CreatedCustomerResponse))] 
public IHttpActionResult CreateCustomer() 
{ 
    ... 
    string location = Request.RequestUri + "/" + NewCustomer.ID.ToString(); 
    return Created(location, new CreatedCustomerResponse { CustomerId = NewCustomer.ID }); 
} 

Ein anderer Weg, dies zu tun ist, um die DataContractAttribute auf Ihrer Customer-Klasse zu verwenden, um die Serialisierung zu steuern.

[DataContract(Name="Customer")] 
public class Customer 
{ 
    [DataMember(Name="CustomerId")] 
    public int ID { get; set; } 

    // DataMember omitted 
    public DateTime? Date { get; set; } 
} 

Dann kehren nur das erstellte Modell

return Created(location, NewCustomer); 
// or 
return CreatedAtRoute<Customer>("DefaultApi", new controller="customercontroller", CustomerID = NewCustomer.ID }, NewCustomer); 
+0

Danke. Das war eine wirklich gute Antwort. Aber ich verstehe nicht, warum "Created()" den Standort und was es ist, benötigt. – user3754602

+0

Es fügt der Antwort, die die URL zu der neu erstellten Entität enthält, einen 'Location'-Header hinzu. – Jasen

Verwandte Themen