2014-04-17 31 views
7

Merhaba C# istemciden Web Api yöntemini web api denetleyicide her zaman için api denetleyicisi null olarak aramak istiyorum. Nasıl kurulur? istemci tarafı:Web Api FromBody web istemcisinden null is

IFileService imgService = new ImageServiceBll(); 
var image = System.Drawing.Image.FromFile(serverFile); 
var dataImage = imgService.ImageToBase64(image, System.Drawing.Imaging.ImageFormat.Png); 

using (var client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri("http://site.local/"); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    // HTTP POST 
    var data = new 
    { 
     imageData = dataImage, 
     version = version 
    }; 

    HttpResponseMessage response = await client.PostAsJsonAsync("api/contenttool/SaveImage", data); 
    if (response.IsSuccessStatusCode) 
    { 
     Uri gizmoUrl = response.Headers.Location; 
    } 
} 

Sunucu Tarafı: Vücutta geçti

public class ContentToolController : ApiController 
{ 
    public IFileService FileService { get; set; } 
    // POST api/contenttool 
    public string SaveImage([FromBody]string data) 
    { 
     JObject jObject = JObject.Parse(data); 
     JObject version = (JObject)jObject["version"]; 

     return "-OK-" + version; 
    } 
} 

cevap

19

Sanırım teknik olarak bir dizgede geçmiyor olmanızla ilgili daha fazla şey var. Anonim bir türün JSON serileştirilmiş bir dizgi temsilcisinden geçiyorsunuz, böylece Web Api'deki serileştirme işlemi size karşı çalışıyor. İsteğiniz denetleyiciye ve bu yönteme ulaştığında, artık bir dize değil. Dinamik olmanız için türün SavImage yönteminde değiştirilmesini deneyin. Şunun gibi:

public string SavImage([FromBody]dynamic data) 
{ 
     JObject jObject = JObject.Parse(data); 
     JObject version = (JObject)jObject["version"]; 

     return "-OK-" + version; 
} 

Maalesef bu noktada Mülklerinizi çıkmak intellisense kullanmak mümkün olmayacaktır. Verileri dinamik türden bir sözlükle almak zorunda kalacaksınız.

Dictionary<string, object> obj = JsonConvert.DeserializeObject<Dictionary<string, object>>(Convert.ToString(data)); 

Elbette diğer seçeneğiniz, istemci ve sunucu arasında paylaşılan gerçek bir tür kullanmak olacaktır. Bu biraz daha kolaylaştıracaktır.

+0

iyi bir nokta, ama PostAsJsonAsync için bir dize gibi param göndermek eğer iyi çalışırsa buldum. –

+1

Gerçekten sisteme karşı çalışıyorsunuz. Verileri bir dize olarak gönderin ve dize olarak bağlayın, VEYA JSON olarak gönderin ve WebAPI tarafında aynı veri nesnesine bağlayın. İkinci yol bunu yapmak için doğru yoldur. Böylece, eylem yönteminizde belirli json manipülasyon kodunu yazmamaktan kaçınırsınız, çerçeve sizin için var. –

+0

@YishaiGalatzer Bunun ile büyük ölçüde aynı fikirdeyim, ama eğer bir nesne listesini serileştirmek istersem, bu sadece bir liste tutmak için yeni bir model yaratmamı zorluyor! Bu delilik değil mi? – Chris

1

dize değeri muhtemelen = işareti ile öneki gerekiyor.

+0

Ne demek istiyorsun? –

+1

Eğer vücutta bir "Hello World" dizesini iletmek istiyorsanız, bunu '= Merhaba Dünya' olarak iletin. –

+0

Bir JSON nesnesini yönteme geçirmeye çalıştığınız anlaşılıyor. Daha iyi bir yol, 'From From'] özniteliği olmayan (basit değerleri aktarmak için tasarlanmış olan) "SavImage" yönteminin parametresi olarak güçlü bir şekilde yazılmış bir nesneye sahip olmaktır. Web API serileştirme ile ilgilenmelidir. –