c# - डब्ल्यूसीएफ बनाम एएसपी.नेट वेब एपीआई





wcf asp.net-web-api (9)


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

वेबपीआई का समर्थक डब्ल्यूसीएफ की तुलना में अधिक हल्का है।

मैंने डब्ल्यूसीएफ के पीछे अवधारणाओं को समझने की कोशिश में कुछ महीने बिताए हैं और हाल ही में मैंने अपना पहला डब्ल्यूसीएफ सेवा आवेदन विकसित किया है।

मैंने कॉन्फ़िगरेशन फ़ाइल में सभी सेटिंग्स को समझने के लिए काफी कुछ संघर्ष किया है।
मैं पर्यावरण के बारे में आश्वस्त नहीं हूं लेकिन ऐसा लगता है कि आप इसके साथ अद्भुत चीजें कर सकते हैं।

दूसरे दिन मुझे पता चला है कि माइक्रोसॉफ्ट एएसपी.नेट वेब एपीआई नामक एक नई चीज़ के साथ बाहर आया है।

जो मैं पढ़ सकता हूं उसके लिए यह एक विश्वसनीय ढांचा है , जिसका उपयोग करना और कार्यान्वित करना बहुत आसान है।

अब, मैं यह समझने की कोशिश कर रहा हूं कि 2 ढांचे के बीच मुख्य अंतर क्या हैं और यदि मुझे अपने पुराने डब्ल्यूसीएफ सेवा एप्लिकेशन को नए एपीआई के साथ बदलने और बदलने की कोशिश करनी चाहिए।

क्या कोई, कृपया मुझे प्रत्येक के मतभेदों और उपयोग को समझने में मदद कर सकता है?




एएसपीनेट वेब एपीआई HTTP और आरईएसटी आधारित जीईटी, पोस्ट, पुट, प्रोग्रामिंग और जेएसओएन लौटने योग्य एएसपीनेट एमवीसी शैली के बारे में अच्छी तरह से पता है; वेब एपीआई सभी हल्के वजन प्रक्रिया और शुद्ध HTTP आधारित घटकों के लिए है। एक आसान या सरल एकल वेब सेवा के लिए भी डब्ल्यूसीएफ के साथ आगे बढ़ने के लिए यह सभी अतिरिक्त सामान लाएगा। AJAX या गतिशील कॉल के लिए हल्के वजन के लिए सरल सेवा हमेशा WebApi आवश्यकता को हल करती है। यह अच्छी तरह से एएसपीनेट एमवीसी के समानांतर में पूरक या मदद करता है।

पॉडकास्ट देखें: हंसेलमिनेट्स पॉडकास्ट 264 - यह आपके पिता का डब्ल्यूसीएफ नहीं है - अधिक जानकारी के लिए स्कॉट हंसेलमैन द्वारा ग्लेन ब्लॉक के साथ वेबएपीआई के बारे में सब कुछ।




नया एएसपी.नेट वेब एपीआई पिछले डब्ल्यूसीएफ वेब एपीआई प्रोजेक्ट की निरंतरता है (हालांकि कुछ अवधारणाएं बदल गई हैं )।

डब्ल्यूसीएफ मूल रूप से एसओएपी-आधारित सेवाओं को सक्षम करने के लिए बनाया गया था। सरल रीस्टफुल या आरपीसीश सेवाओं के लिए (jQuery जैसे क्लाइंट सोचें) एएसपी.नेट वेब एपीआई अच्छी पसंद होनी चाहिए।




Wcf के साथ हम टीसीपी, http.if जैसे कई एंडपॉइंट्स के लिए समान सेवा समर्थन को कॉन्फ़िगर और एक्सपोज़ कर सकते हैं, यदि आप चाहते हैं कि आपकी सेवा केवल http आधारित हो, तो वेब एपीआई के साथ जाना बेहतर होगा। WCF की तुलना में वेब एपीआई बहुत कम कॉन्फ़िगरेशन है और wcf से थोड़ा तेज है। डब्ल्यूसीएफ भी आराम से सेवाओं का समर्थन करता है। यदि आपके पास नेट फ्रेमवर्क 3.5 की सीमा है तो आपका विकल्प wcf है।




हमारे लिए, आरओएसटी के लिए एसओएपी और वेब एपीआई के लिए डब्ल्यूसीएफ का उपयोग किया जाता है। मैं चाहता हूं कि वेब एपीआई भी एसओएपी का समर्थन करे। हम डब्ल्यूसीएफ की उन्नत सुविधाओं का उपयोग नहीं कर रहे हैं। msdn.microsoft.com/en-us/library/jj823172.aspx से तुलना यहां दी गई है:




इसके बारे में एमएसडीएन पर एक तुलना है

डब्ल्यूसीएफ और एएसपी.नेट वेब एपीआई

मेरे लिए, विकल्प इस बारे में था कि ग्राहक कौन हैं, और वे कहां स्थित हैं?

कंपनी नेटवर्क और .NET आधारित ग्राहकों के भीतर: टीसीपी बाध्यकारी (HTTP से तेज़ संचार) के साथ डब्ल्यूसीएफ का उपयोग करें

कंपनी नेटवर्क के बाहर, और PHP, पायथन आदि जैसी विविध तकनीकों का उपयोग करें: आरईएसटी के साथ वेब एपीआई का उपयोग करें




कथन के बारे में "WebApi WSDL की कमी है" बाकी क्लाइंट उत्पन्न करने के कई तरीके हैं। एक लोकप्रिय दृष्टिकोण स्वैगर यूआई / (स्वाशबुक्कल नुजेट) है। यह अंत बिंदुओं का परीक्षण करने के लिए आरईएसटी एंड पॉइंट के इनपुट और आउटपुट स्कीमा और ऑनलाइन टूल को समझने के लिए एक समृद्ध इंटरफेस देता है।

जेएसओएन एलडी (जेसन लिंक्ड डॉक्यूमेंट्स) एक और उभरता हुआ मानक है जो जेएसओएन आधारित आरईएसटी डेवलपर अनुभव को बेहतर अर्थशास्त्र के साथ जेएसओएन स्कीमा को उजागर करके बेहतर करेगा।




अब तक दोनों का उपयोग करने के बाद, मुझे डब्ल्यूसीएफ और वेब एपीआई के बीच कई अंतर मिले। दोनों प्रौद्योगिकियों अलग-अलग परिदृश्य में अच्छी तरह उपयुक्त हैं। तो यह कहना संभव नहीं है कि कौन सा बेहतर है, यह विन्यास और परिदृश्य पर निर्भर करता है।

नोट: डेटा न केवल मेरा विचार है बल्कि यह अन्य आधिकारिक वेबसाइट से भी एकत्रित किया जाता है।




क्या आपने DevDefined.OAuth की कोशिश की है?

मैंने इसे अपने वेबएपी को 2-लेगेड ओथ के साथ सुरक्षित करने के लिए उपयोग किया है। मैंने PHP क्लाइंट के साथ सफलतापूर्वक इसका परीक्षण किया है।

इस पुस्तकालय का उपयोग करके OAuth के लिए समर्थन जोड़ने में काफी आसान है। यहां बताया गया है कि आप एएसपी.नेट एमवीसी वेब एपीआई के लिए प्रदाता को कैसे कार्यान्वित कर सकते हैं:

1) DevDefined.OAuth का स्रोत कोड प्राप्त करें: https://github.com/bittercoder/DevDefined.OAuth - नवीनतम संस्करण OAuthContextBuilder एक्स्टेंसिबिलिटी के लिए अनुमति देता है।

2) लाइब्रेरी बनाएं और इसे अपने वेब एपीआई प्रोजेक्ट में संदर्भित करें।

3) HttpRequestMessage से संदर्भ बनाने में सहायता के लिए एक कस्टम संदर्भ निर्माता बनाएं:

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Net.Http;
using System.Web;

using DevDefined.OAuth.Framework;

public class WebApiOAuthContextBuilder : OAuthContextBuilder
{
    public WebApiOAuthContextBuilder()
        : base(UriAdjuster)
    {
    }

    public IOAuthContext FromHttpRequest(HttpRequestMessage request)
    {
        var context = new OAuthContext
            {
                RawUri = this.CleanUri(request.RequestUri), 
                Cookies = this.CollectCookies(request), 
                Headers = ExtractHeaders(request), 
                RequestMethod = request.Method.ToString(), 
                QueryParameters = request.GetQueryNameValuePairs()
                    .ToNameValueCollection(), 
            };

        if (request.Content != null)
        {
            var contentResult = request.Content.ReadAsByteArrayAsync();
            context.RawContent = contentResult.Result;

            try
            {
                // the following line can result in a NullReferenceException
                var contentType = 
                    request.Content.Headers.ContentType.MediaType;
                context.RawContentType = contentType;

                if (contentType.ToLower()
                    .Contains("application/x-www-form-urlencoded"))
                {
                    var stringContentResult = request.Content
                        .ReadAsStringAsync();
                    context.FormEncodedParameters = 
                        HttpUtility.ParseQueryString(stringContentResult.Result);
                }
            }
            catch (NullReferenceException)
            {
            }
        }

        this.ParseAuthorizationHeader(context.Headers, context);

        return context;
    }

    protected static NameValueCollection ExtractHeaders(
        HttpRequestMessage request)
    {
        var result = new NameValueCollection();

        foreach (var header in request.Headers)
        {
            var values = header.Value.ToArray();
            var value = string.Empty;

            if (values.Length > 0)
            {
                value = values[0];
            }

            result.Add(header.Key, value);
        }

        return result;
    }

    protected NameValueCollection CollectCookies(
        HttpRequestMessage request)
    {
        IEnumerable<string> values;

        if (!request.Headers.TryGetValues("Set-Cookie", out values))
        {
            return new NameValueCollection();
        }

        var header = values.FirstOrDefault();

        return this.CollectCookiesFromHeaderString(header);
    }

    /// <summary>
    /// Adjust the URI to match the RFC specification (no query string!!).
    /// </summary>
    /// <param name="uri">
    /// The original URI. 
    /// </param>
    /// <returns>
    /// The adjusted URI. 
    /// </returns>
    private static Uri UriAdjuster(Uri uri)
    {
        return
            new Uri(
                string.Format(
                    "{0}://{1}{2}{3}", 
                    uri.Scheme, 
                    uri.Host, 
                    uri.IsDefaultPort ?
                        string.Empty :
                        string.Format(":{0}", uri.Port), 
                    uri.AbsolutePath));
    }
}

4) ओएथ प्रदाता बनाने के लिए इस ट्यूटोरियल का प्रयोग करें: http://code.google.com/p/devdefined-tools/wiki/OAuthProvider । अंतिम चरण में (संरक्षित संसाधन उदाहरण तक पहुंच) आप इस कोड का उपयोग अपने AuthorizationFilterAttribute विशेषता में कर सकते हैं:

public override void OnAuthorization(HttpActionContext actionContext)
{
    // the only change I made is use the custom context builder from step 3:
    OAuthContext context = 
        new WebApiOAuthContextBuilder().FromHttpRequest(actionContext.Request);

    try
    {
        provider.AccessProtectedResourceRequest(context);

        // do nothing here
    }
    catch (OAuthException authEx)
    {
        // the OAuthException's Report property is of the type "OAuthProblemReport", it's ToString()
        // implementation is overloaded to return a problem report string as per
        // the error reporting OAuth extension: http://wiki.oauth.net/ProblemReporting
        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
            {
               RequestMessage = request, ReasonPhrase = authEx.Report.ToString()
            };
    }
}

मैंने अपना खुद का प्रदाता लागू किया है इसलिए मैंने उपरोक्त कोड का परीक्षण नहीं किया है (बेशक WebApiOAuthContextBuilder जिसे मैं अपने प्रदाता में उपयोग कर रहा हूं) लेकिन इसे ठीक काम करना चाहिए।





c# wcf asp.net-web-api