2012-11-02 13 views
54

मैंने अतीत में कुछ एएसपी.नेट एमवीसी अनुप्रयोग बनाए हैं, लेकिन मैंने पहले कभी वेबएपीआई का उपयोग नहीं किया है। मैं सोच रहा हूं कि मैं एक साधारण एमवीसी 4 ऐप कैसे बना सकता हूं जो सामान्य एमवीसी नियंत्रक के बजाय वेबएपीआई के माध्यम से सरल सीआरयूडी सामान करता है। चाल यह है कि वेबएपीआई एक अलग समाधान होना चाहिए (और, वास्तव में, एक अलग सर्वर/डोमेन पर बहुत अच्छी तरह से हो सकता है)।एएसपी.नेट एमवीसी 4 एप्लीकेशन कॉलिंग रिमोट वेबएपीआई

मैं यह कैसे कर सकता हूं? मैं क्या खो रहा हूँ? क्या यह सिर्फ वेबएपीआई सर्वर को इंगित करने के लिए मार्ग स्थापित करने का मामला है? मुझे लगता है कि एमवीसी अनुप्रयोग का उपयोग कर वेबएपीआई का उपभोग करने के लिए दिखाए गए सभी उदाहरणों में लगता है कि वेबएपीआई एमवीसी अनुप्रयोग में "बेक्ड" है, या कम से कम एक ही सर्वर पर है।

ओह, और स्पष्टीकरण के लिए, मैं jQuery का उपयोग करके अजाक्स कॉल के बारे में बात नहीं कर रहा हूं ... मेरा मतलब है कि एमवीसी अनुप्रयोग के नियंत्रक को डेटा प्राप्त करने/रखने के लिए वेबएपीआई का उपयोग करना चाहिए।

उत्तर

74

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

यहां एक अत्यधिक सरलीकृत उदाहरण है। , तब

public class CarRESTService { 

    readonly string uri = "http://localhost:2236/api/cars"; 

    public async Task<List<Car>> GetCarsAsync() { 

     using (HttpClient httpClient = new HttpClient()) { 

      return JsonConvert.DeserializeObject<List<Car>>(
       await httpClient.GetStringAsync(uri)  
      ); 
     } 
    } 
} 

मैं अतुल्यकालिक रूप से मेरी MVC नियंत्रक के माध्यम से है कि उपभोग कर सकते हैं नीचे के रूप में: निम्नलिखित कोड एक नमूना अनुरोध के लिए सहायक वर्ग है

public class HomeController : Controller { 

    private CarRESTService service = new CarRESTService(); 

    public async Task<ActionResult> Index() { 

     return View("index", 
      await service.GetCarsAsync() 
     ); 
    } 
} 

आप के लिए नीचे पोस्ट पर एक नज़र हो सकता है ASP.NET MVC के साथ अतुल्यकालिक मैं/हे आपरेशन के प्रभाव को देखने के:

My Take on Task-based Asynchronous Programming in C# 5.0 and ASP.NET MVC Web Applications

+1

+1 मैं इसे अपने वेब ऐप्स में ठीक तरह से करता हूं –

+0

यह बहुत अच्छा लगता है, लेकिन मुझे काम करने के लिए async/प्रतीक्षा सामग्री नहीं मिल सकती है। आईडीई उन खोजशब्दों को पसंद नहीं करता है। मैं .NET 4.0 का उपयोग कर रहा हूं और NuGet का उपयोग कर वेब एपीआई क्लाइंट पुस्तकालयों को स्थापित किया है। –

+2

@GlennArndt आप .NET 4.0 के साथ async/प्रतीक्षा का उपयोग नहीं कर सकते हैं जब तक आप कुछ और कार्य नहीं करते। इस ब्लॉग पोस्ट को देखें: http://blogs.msdn.com/b/bclteam/archive/2012/10/22/using-async-await-without-net-framework-4-5.aspx आप एसिंक नियंत्रक क्रियाओं का लाभ उठा सकते हैं w/o async और कीवर्ड का इंतजार है लेकिन फिर यह गन्दा हो जाता है। – tugberk

1

http://restsharp.org/ आपके प्रश्नों का उत्तर है। मैं वर्तमान में इसे ऐसे एप्लिकेशन में उपयोग कर रहा हूं जिसमें समान संरचना है।

लेकिन आमतौर पर वेबएपीआई का उपयोग करने से डेटा पोस्ट करना और अनुरोध करना है कि प्रक्रिया कैसे करें। आप मानक WebRequest और जावास्क्रिप्टसेरियलाइज़र का भी उपयोग कर सकते हैं।

चीयर्स।

+3

'वेबरक्वेट' और 'जावास्क्रिप्टसेरियलाइज़र' अब स्टैक के अंदर पुराने स्कूल एपीआई हैं। नया 'एचटीपी क्लाइंट' जाने का रास्ता है। यह ओओटीबी स्वरूपण समर्थन प्रदान करता है साथ ही यदि आप [Microsoft.AspNet.WebApi.Client] (http://nuget.org/packages/Microsoft.AspNet.WebApi.Client) NuGet पैकेज स्थापित करते हैं और यह JSON क्रमबद्धता और deserialization द्वारा निष्पादित करेगा जेसन.NET का उपयोग कर। – tugberk

1

इस मामले में, आप अपने नियंत्रक से वेब एपीआई उपभोग करने के लिए HttpClient का उपयोग कर सकते हैं।

10

आप सेवा का उपभोग करने के WCF उपयोग कर सकते हैं। इसलिए जैसा:

[ServiceContract] 
public interface IDogService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "/api/dog")] 
    IEnumerable<Dog> List(); 
} 

public class DogServiceClient : ClientBase<IDogService>, IDogService 
{ 
    public DogServiceClient(string endpointConfigurationName) : base(endpointConfigurationName) 
    { 
    } 

    public IEnumerable<Dog> List() 
    { 
     return Channel.List(); 
    } 
} 

और फिर आप अपने नियंत्रक में यह उपभोग कर सकते हैं:

public class HomeController : Controller 
{ 
    public HomeController() 
    { 
    } 

    public ActionResult List() 
    { 
     var service = new DogServiceClient("YourEndpoint"); 
     var dogs = service.List(); 
     return View(dogs); 
    } 
} 

और अपने web.config में आप अपने अंत बिंदु के लिए विन्यास जगह:

<system.serviceModel> 
    <client> 
    <endpoint address="http://localhost/DogService" binding="webHttpBinding" 
    bindingConfiguration="" behaviorConfiguration="DogServiceConfig" 
    contract="IDogService" name="YourEndpoint" /> 
    </client> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="DogServiceConfig"> 
     <webHttp/> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
</system.serviceModel> 
+0

मुझे वास्तव में कार्यान्वयन को छिपाने के लिए wcf का उपयोग करना पसंद है इंटरफ़ेस के पीछे सेवा को कॉल करने का विवरण। बहुत अच्छी टिप। – Martin

+0

मेरे पास एक एएसपीनेट बाहरी साइट है और एक एमवीसी इंटरल केवल वेब एपीआई है। मैं वही कैसे कर सकता हूं? बाहरी साइट से आंतरिक केवल वेब एपीआई को कॉल करें? http://stackoverflow.com/questions/43002283/how-to-allow-internal-mvc-web-api-from-external-site-outside-the-network – Si8

15

सभी को धन्यवाद प्रतिक्रियाओं के लिए। @tugberk मुझे सही रास्ता नीचे ले गया, मुझे लगता है। यह मेरे लिए काम किया ...

मेरी CarsRESTService सहायक के लिए:

public class CarsRESTService 
{ 
    readonly string baseUri = "http://localhost:9661/api/cars/"; 

    public List<Car> GetCars() 
    { 
     string uri = baseUri; 
     using (HttpClient httpClient = new HttpClient()) 
     { 
      Task<String> response = httpClient.GetStringAsync(uri); 
      return JsonConvert.DeserializeObjectAsync<List<Car>>(response.Result).Result; 
     } 
    } 

    public Car GetCarById(int id) 
    { 
     string uri = baseUri + id; 
     using (HttpClient httpClient = new HttpClient()) 
     { 
      Task<String> response = httpClient.GetStringAsync(uri); 
      return JsonConvert.DeserializeObjectAsync<Car>(response.Result).Result; 
     } 
    } 
} 

और फिर CarsController के लिए।सीएस:

public class CarsController : Controller 
{ 
    private CarsRESTService carsService = new CarsRESTService(); 

    // 
    // GET: /Cars/ 

    public ActionResult Index() 
    { 
     return View(carsService.GetCars()); 
    } 

    // 
    // GET: /Cars/Details/5 

    public ActionResult Details(int id = 0) 
    { 
     Car car = carsService.GetCarById(id); 

     if (car == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(car); 
    } 
} 
+0

या तो स्ट्रिंग इंटरपोलेशन का उपयोग करें (नई सी # 6 सुविधा इसके बाद से जोड़ा गया सवाल पूछा गया था) या "string uri = baseUri + id;" की बजाय string.builder, चीजों को पढ़ने में आसान बना देगा और थोड़ा कम संसाधन गहन होगा :) – Rexxo

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