2014-04-17 6 views
7

हैलो मैं वेब एपीआई नियंत्रक में अपने बॉडी वैरिएबल द्वारा सी # क्लाइंट से वेब एपीआई विधि को कॉल करना चाहता हूं, हर समय शून्य है। इसे कैसे सेट करें? ग्राहक के पक्ष:वेब एपी से बॉडी वेब क्लाइंट से शून्य है

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

सर्वर साइड:

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

उत्तर

19

मुझे लगता है कि इस तथ्य के साथ और अधिक करना है कि आप तकनीकी रूप से स्ट्रिंग में नहीं जा रहे हैं। आप किसी अज्ञात प्रकार के JSON क्रमबद्ध स्ट्रिंग प्रस्तुति में गुजर रहे हैं, इसलिए वेब एपी में deserialization प्रक्रिया आपके खिलाफ काम कर रही है। जब तक आपका अनुरोध नियंत्रक और उस विधि को प्राप्त होता है, तब तक यह अब एक स्ट्रिंग नहीं है। गतिशील होने के लिए SavImage विधि पर अपना प्रकार बदलने का प्रयास करें। इस तरह:

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

     return "-OK-" + version; 
} 

दुर्भाग्य से उस बिंदु पर आप नहीं IntelliSense उपयोग करने के लिए अपनी संपत्ति बाहर निकलने के लिए सक्षम हो जाएगा। आपको एक शब्दकोश के माध्यम से गतिशील प्रकार से डेटा प्राप्त करना होगा।

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

बेशक आपका दूसरा विकल्प क्लाइंट और सर्वर के बीच साझा किए गए वास्तविक प्रकार का उपयोग करना होगा। इससे यह थोड़ा आसान हो जाएगा।

+0

अच्छा बिंदु, लेकिन मुझे पता चला कि PostAsJsonAsync को एक स्ट्रिंग की तरह param भेजना ठीक है, यह ठीक काम करेगा। –

+1

आप वास्तव में सिस्टम के खिलाफ काम कर रहे हैं। या तो एक स्ट्रिंग के रूप में डेटा भेजें और स्ट्रिंग के रूप में बाध्य करें, या JSON के रूप में भेजें और वेबएपीआई पक्ष पर उसी डेटा ऑब्जेक्ट से जुड़ें। दूसरा तरीका यह करने का सही तरीका है। इस प्रकार आप अपनी एक्शन विधि में विशिष्ट जेसन मैनिपुलेशन कोड लिखने से बचते हैं, फ्रेमवर्क आपके लिए ऐसा करता है। –

+0

@YishaiGalatzer मैं इसके साथ सबसे अधिक भाग के लिए सहमत हूं, लेकिन अगर मैं वस्तुओं की एक सूची को क्रमबद्ध करना चाहता हूं, तो यह मुझे सूची रखने के लिए बस एक नया मॉडल बनाने के लिए मजबूर करेगा! ऐसा लगता है कि यह पागल नहीं है? – Chris

1

स्ट्रिंग शरीर में भेजे गए मान को शायद = संकेत के साथ उपसर्ग की जरूरत है।

+0

आपका क्या मतलब है? –

+1

यदि आप शरीर में एक स्ट्रिंग 'हैलो वर्ल्ड' पास करना चाहते हैं, तो इसे '= हैलो वर्ल्ड' के रूप में पास करें। –

+0

ऐसा लगता है कि आप विधि में JSON ऑब्जेक्ट को पास करने का प्रयास कर रहे हैं। एक बेहतर तरीका होगा 'Savimage' विधि के पैरामीटर के रूप में दृढ़ता से टाइप किया गया ऑब्जेक्ट '[FromBody]' विशेषता के बिना (जिसे वास्तव में सरल मानों को पारित करने के लिए डिज़ाइन किया गया है)। वेब एपीआई को क्रमबद्धता का ख्याल रखना चाहिए। –

संबंधित मुद्दे