2012-04-12 18 views
57

MVC kullanırken, ad hoc Json döndürüldü.Web API ile anonim tiplerin döndürülmesi

return Json(new { Message = "Hello"}); 

Bu işlevselliği yeni Web API'sı ile arıyorum.

public HttpResponseMessage<object> Test() 
{  
    return new HttpResponseMessage<object>(new { Message = "Hello" }, HttpStatusCode.OK); 
} 

Bu DataContractJsonSerializer olarak bir istisna anonim türlerini işleyemez atar.

Bunu, Json.Net numaralı telefon numarasına göre bu JsonNetFormatter ile değiştirdim. Ben

public object Test() 
{ 
    return new { Message = "Hello" }; 
} 

kullanmak ama ben HttpResponseMessage dönmezsem Web API kullanarak noktasını göremiyorsanız Bu işleri ben vanilya MVC ile yapışmasını daha iyi olurdu. Ben denemek ve kullanıyorsanız:

public HttpResponseMessage<object> Test() 
{ 
    return new HttpResponseMessage<object>(new { Message = "Hello" }, HttpStatusCode.OK); 
} 

Bu bütün HttpResponseMessage serializes.

HttpResponseMessage içinde anonim türleri döndürebileceğim bir çözüm için bana yol gösterebilecek herhangi biri var mı?

cevap

67

(ı. Bir şey işe yaramazsa bana bildirin, daha sonra günümüze kadar bu test etmek için bir şansı olmayacaktır), ancak son yaptığı bit (http://aspnetwebstack.codeplex.com dan inşa edilmiş), bu yüzden muhtemelen RC için yol olacaktır. Sen

public HttpResponseMessage Get() 
{ 
    return this.Request.CreateResponse(
     HttpStatusCode.OK, 
     new { Message = "Hello", Value = 123 }); 
} 
+0

Geçerli sürümde bu durum geçerli değildir. Yukarıdaki gibi bir şey yürütürken bir HTTP 500 alırsınız. – CodeMonkeyKing

+0

4.0 RTM'de benim için gayet iyi çalışıyor. – Snixtor

+14

Önemli bir not, Sadece varsayılan json serializer anonim nesnelerin serileştirilmesini işleyebilir. Varsayılan xml serializer hata verir, böylece istemcinin kabul etmek istediği anonim nesneleri döndürdüğünüzden emin olun: application/json header. Browser gibi Chrome da varsayılan olarak sadece xml istek olarak xml talep etme eğilimindedir. – Despertar

1

Jenerikler kullanıyorsanız, bunu anonim türünüz için bir "tür" sağlayacağından, bunu çalıştırmanız gerekir. Ardından, serializer'ı buna bağlayabilirsiniz.

public HttpResponseMessage<T> MakeResponse(T object, HttpStatusCode code) 
{ 
    return new HttpResponseMessage<T>(object, code); 
} 

classınıza hiçbir DataContract veya DataMebmer nitelikleri varsa, geri aradığınız tam olarak ne yapması gerektiğini tüm kamu özellikleri, seri hale düşecek. Bu Beta sürümünde çalışmaz

3

Bunun için JSONObject nesnesi kullanabilirsiniz yapabilirsiniz:

dynamic json = new JsonObject(); 
json.Message = "Hello"; 
json.Value = 123; 

return new HttpResponseMessage<JsonObject>(json); 
2

Ayrıca deneyebilirsiniz:

var request = new HttpRequestMessage(HttpMethod.Post, "http://leojh.com"); 
var requestModel = new {User = "User", Password = "Password"}; 
request.Content = new ObjectContent(typeof(object), requestModel, new JsonMediaTypeFormatter()); 
3

Bir ExandoObject kullanabilirsiniz.

[Route("api/message")] 
[HttpGet] 
public object Message() 
{ 
    dynamic expando = new ExpandoObject(); 
    expando.message = "Hello"; 
    expando.message2 = "World"; 
    return expando; 
} 
0

Sen WebAPI içinde

public class GenericResponse : BaseResponse 
{ 
    public dynamic Data { get; set; } 
} 

ve sonra gibi nesneyi dönen dinamik nesneyi sarabiliriz (using System.Dynamic; ekleyin); Böyle bir şey yapmak: Bu cevap biraz geç gelebilir

[Route("api/MethodReturingDynamicData")] 
[HttpPost] 
public HttpResponseMessage MethodReturingDynamicData(RequestDTO request) 
{ 
    HttpResponseMessage response; 
    try 
    { 
     GenericResponse result = new GenericResponse(); 
     dynamic data = new ExpandoObject(); 
     data.Name = "Subodh"; 

     result.Data = data;// OR assign any dynamic data here;// 

     response = Request.CreateResponse<dynamic>(HttpStatusCode.OK, result); 
    } 
    catch (Exception ex) 
    { 
     ApplicationLogger.LogCompleteException(ex, "GetAllListMetadataForApp", "Post"); 
     HttpError myCustomError = new HttpError(ex.Message) { { "IsSuccess", false } }; 
     return Request.CreateErrorResponse(HttpStatusCode.OK, myCustomError); 
    } 
    return response; 
} 
10

ama bugün itibariyle WebApi 2 zaten dışarı ve şimdi size sadece yapmak zorunda kalacak istediğini yapmak daha kolaydır:

public object Message() 
{ 
    return new { Message = "hello" }; 
} 

ve boru hattı boyunca xml ya da json ya da müşterinin tercihlerine göre (Accept başlık) serileştirilecektir. Umarım bu soru üzerine tökezleyen herkesin yardımcı olur

+0

Benim için değil – doker

+0

@doker WebApi'nin hangi sürümünü kullanıyorsunuz, bu kodumu VS 2015 ve WebApi2 – Luiso

+0

kullanarak benim kontrol cihazımdan yapıştırdım. 5.2 .3 ve xml formater'ı kaldırdık çünkü çoğu döndürülen nesne zaten xml'ye serileşmeyecekti. – doker