2012-10-05 10 views
23

मैं एक एमवीसी एक्शन कंट्रोलर विधि से एक वेब एपीआई विधि कैसे कॉल कर सकता हूं। यह वह जगह है मैं क्या कोशिश कर रहा हूँ, यह मेरा नियंत्रक विधि है:मैं एमवीसी कंट्रोलर एक्शन विधि से WebApi विधि कैसे कॉल कर सकता हूं?

public ActionResult ProductDetail(long id) 
{ 
    using (var client = new HttpClient()) 
    { 
     var productDetailUrl = Url.RouteUrl(
      "DefaultApi", 
      new { httproute = "", controller = "ProductDetails", id = id }, 
      Request.Url.Scheme 
     ); 
     var model = client 
        .GetAsync(productDetailUrl) 
        .Result 
        .Content.ReadAsAsync<ProductItems>().Result; 

     return View(model); 
    } 
} 

मेरे जाल एपीआई विधि:

private ProductEntities products = new ProductEntities(); 

public IEnumerable<ProductItems> GetProductDetail(int ID) 
{    
    var produc= products.ExecuteStoreQuery<ProductItems>(
      "GetProductDetail @ProductID ", 
      new SqlParameter("@ProductID", ID)); 

    return produc; 
} 

मैं इस जब कर रहा हूँ मैं अपने MVC कार्रवाई विधि में किसी त्रुटि @ वर मॉडल हो रही है कह

डेटा लौटने के बाद "Newtonsoft.Json.JsonSerializationException: deserialize नहीं कर सकते JSON सरणी" (यानी [1,2,3]) प्रकार 'ProductDetails.Models.ProductItems' में। deserialized प्रकार एक सरणी होना चाहिए या संग्रह इंटरफ़ेस जैसे Inumerable, ICollection या IList को लागू करना चाहिए। JSON arrays को deserialize करने के लिए JsonArrayAttribute को प्रकार में जोड़ने के लिए मजबूर करने के लिए। लाइन 1, स्थिति 1. "

किसी भी एक मेरी मदद कर सकते यह कर ... या मुझे किसी अन्य सबसे अच्छा तरीका सुझाव है या मुझे ठीक कर लें मैं गलत कर रहा हूँ किसी भी जहां ... मैं है लौटे दिखाने के लिए मेरे विचार में डेटा ... डेटा को मेरे नियंत्रक

+0

मैं कक्षा/ऑब्जेक्ट नाम के लिए ProductItems के बजाय ProductItem का उपयोग करूंगा। और "var" शब्द का उपयोग इन मुद्दों को हल करने में बाधा डालता है, आईएमएचओ। – granadaCoder

उत्तर

15

अपवाद के रूप में कहा गया है "... deserialize JSON सारणी नहीं कर सकते" आप क्रमबद्धता के साथ अपने वेब api विधि में नहीं अक्रमांकन साथ रिसीवर की ओर, उदा, पर एक समस्या है।

और आपकी समस्या यह है कि आप गलत प्रकार में deserialize क्योंकि अपने वेब api विधि लगता है कि कोशिश है:

तो यह रिटर्न IEnumerable<ProductItems> (जैसे ProductItems की एक सरणी), लेकिन अपने नियंत्रक कार्रवाई में तुम कोशिश करो कॉल ReadAsAsync<ProductItems>()

साथ एकProductItems में प्रतिक्रिया deserialize करने के लिए तो एक सरणी ProductItems में deserialize करने के लिए अपने ReadAsAsync बदल सकते हैं और यह काम करना चाहिए:

var model = client 
       .GetAsync(productDetailUrl) 
       .Result 
       .Content.ReadAsAsync<ProductItems[]>().Result; 
+0

पर कॉल कर रहे हैं एक अपवाद कहता है कि शब्दकोश में उत्पादित मॉडल आइटम 'ProductDetails.Models.ProductItems []' प्रकार का है, लेकिन इस शब्दकोश के लिए 'ProductDetails.Models.ProductItems' प्रकार के मॉडल आइटम की आवश्यकता होती है। – SoftwareNerd

+0

अब समस्या आपका उत्पाद 'ProductDetail.cshtml' है जहां आपने अनुमान लगाया है' @ मॉडल उत्पाद विवरण। मॉडल। उत्पाद Items'। यदि आपकी वेबपी विधि वैसे भी केवल एक 'उत्पाद इटम्स' लौटाती है तो आप अपने कंट्रोलर में 'रिटर्न व्यू (मॉडल [0]) लिख सकते हैं। या 'inumerable ' के बजाय केवल 'ProductItems' को वापस करने के लिए अपनी वेबपी विधि बदलें ... – nemesv

8

पर वापस लौटाया जाना चाहिए जब आपकी एएसपी.नेट वेबसाइट वेब एपीआई नियंत्रक के साथ मिलकर हो रही है तो आप वेब एपीआई को HTTP से संबंधित किसी भी देरी से बचने के लिए सामान्य क्लास विधि के रूप में कॉल कर सकते हैं अनुरोध।

और समस्या वेब एपीआई कॉल में नहीं है। समस्या परिणामस्वरूप deserialization है, जो ExecuteStoreQuery से आता है, सुनिश्चित करें कि आपके पास serializable coll है इसमें ईक्शन यह सुनिश्चित करने के लिए, आप इस विधि परिणाम को वापस लौटने से पहले सूची में बदलने और वेब एपीआई विधि serializable सूची से वापस आने का प्रयास कर सकते हैं, फिर समस्या को स्थानीयकृत कर सकते हैं।

यूपीडी: तो, समस्या की जड़ ExecuteStoreQuery विधि रिटर्न में है। यह ObjectResult देता है। यह वास्तव में IENumerable लागू करता है, लेकिन यह ईएफ से वापस आ गया है और कुछ मामलों में उदा। वस्तुओं के बीच चक्रीय निर्भरता, कि जेसन deserialzers हल नहीं कर सका।

समस्या को हल करने के लिए बस स्पष्ट रूप से ObjectResult को रूपांतरित करें। सूची:

public IEnumerable<ProductItems> GetProductDetail(int ID) 
{    
    var products = products.ExecuteStoreQuery<ProductItems>(
       "GetProductDetail @ProductID ",  
       new SqlParameter("@ProductID", ID)); 
    return products.ToList<ProductItems>(); 
} 

जब समस्या अपने ऑब्जेक्ट एफई से आते हैं के संग्रह में चक्र निर्भरता के साथ वास्तव में है, तो आप इसे Json.NET

में बंद कर सकते हैं

और यह भी अपने ग्राहक के पक्ष अक्रमांकन की जाँच करें:

var model = client.GetAsync(productDetailUrl).Result 
       .Content.ReadAsAsync<List<ProductItems>>().Result; 

लेकिन जब आप एक परियोजना में अपनी एएसपी.नेट एमवीसी साइट और एएसपी.नेट वेब एपीआई होस्ट कर रहे हैं, तो आपको HTTP अनुरोध और क्रमबद्धता/deserialization के साथ इन सभी चीजों की आवश्यकता नहीं है, बस अपनी विधि को सामान्य वर्ग विधि के रूप में कॉल करें।

+0

क्या आप मुझे – SoftwareNerd

+0

@ एनील बस बदलने में मदद कर सकते हैं, प्रश्न में दोनों मुद्दे को इंगित करने के लिए – Regfor

+0

+1 को आजमाएं, और यह भी इंगित करने के लिए कि आप नियंत्रक के उदाहरण को तुरंत चालू कर सकते हैं और विधि –

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