WCF विन्यास एक विन्यास फाइल के बिना


90

क्या किसी को कॉन्फ़िगरेशन फ़ाइल के उपयोग के बिना प्रोग्राम में डब्ल्यूसीएफ सेवा को उजागर करने का एक अच्छा उदाहरण पता है? मुझे पता है कि WCF के साथ सेवा वस्तु मॉडल बहुत समृद्ध है, इसलिए मुझे पता है कि यह संभव है। मैंने अभी ऐसा नहीं देखा है कि ऐसा कैसे किया जाता है। इसके विपरीत, मैं यह देखना चाहूंगा कि कॉन्फ़िगरेशन फ़ाइल के बिना उपभोग कैसे किया जाता है।

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


1
आप इस तरह के अभ्यास की सिफारिश क्यों नहीं करेंगे (सेवा को बिना कॉन्फ़िगरेशन के उजागर करना)?
बोर्नटोडकोड

जवाबों:


115

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

internal static MyServiceSoapClient CreateWebServiceInstance() {
    BasicHttpBinding binding = new BasicHttpBinding();
    // I think most (or all) of these are defaults--I just copied them from app.config:
    binding.SendTimeout = TimeSpan.FromMinutes( 1 );
    binding.OpenTimeout = TimeSpan.FromMinutes( 1 );
    binding.CloseTimeout = TimeSpan.FromMinutes( 1 );
    binding.ReceiveTimeout = TimeSpan.FromMinutes( 10 );
    binding.AllowCookies = false;
    binding.BypassProxyOnLocal = false;
    binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
    binding.MessageEncoding = WSMessageEncoding.Text;
    binding.TextEncoding = System.Text.Encoding.UTF8;
    binding.TransferMode = TransferMode.Buffered;
    binding.UseDefaultWebProxy = true;
    return new MyServiceSoapClient( binding, new EndpointAddress( "http://www.mysite.com/MyService.asmx" ) );
}

मैं व्यक्तिगत रूप से इस दृष्टिकोण को उदाहरणों के लिए पसंद करता हूं जब आप किसी भिन्न मामले में फ़ाइल का उपयोग करने जा रहे हैं, उदाहरण के लिए, यदि आपने अपने ऐप को एन्क्रिप्ट किया है। या (कॉन्फ़िगर फ़ाइल कॉन्फ़िगर नहीं है) और WCF में निर्मित उपयोग करने की आवश्यकता नहीं है एक कनेक्शन में इसे पढ़ने की क्षमता
नूह 20

18
Https उपयोग के लिए, बाइंडिंग जोड़ें ।ecurity.Mode = BasicHttpSecurityMode.Transport;
१०:५० पर सिस्कोहेट

इसने मेरे लिए काफी अच्छा काम किया। मेरे लिए एकमात्र अंतर यह है कि मैंने ReaderQuotas और सुरक्षा जानकारी भी सेट की है। मैंने ciscoheat की सलाह का उपयोग किया और Security.Transport.Mode को परिवहन के लिए सेट कर दिया यदि https का उपयोग किया जाता है (मेरे लिए यह संकलन समय पर ज्ञात नहीं है)।
कर्क लीमोहेन

2
मैंने अभी सत्यापित किया है कि सेट की जा रही सभी संपत्तियाँ WCF 4, fwiw में चूक के बराबर हैं। (लेकिन ध्यान दें कि Security.Modeचूक करने के लिए None।)
लादेन

19

यदि आप IIS की होस्टिंग के लिए web.config में System.ServiceModel सेक्शन के उपयोग को समाप्त करने में रुचि रखते हैं, तो मैंने एक उदाहरण पोस्ट किया है कि यहाँ कैसे करें ( http://bejabbers2.blogspot.com/2010/02/wff -zero-config-in-net-35-part-ii.html )। मैं दिखाता हूं कि मेटाडेटा और wshttpbinding एंडपॉइंट दोनों बनाने के लिए एक ServiceHost को कैसे अनुकूलित किया जाए। मैं इसे एक सामान्य उद्देश्य तरीके से करता हूं जिसमें अतिरिक्त कोडिंग की आवश्यकता नहीं होती है। जो लोग .NET 4.0 में तुरंत अपग्रेड नहीं कर रहे हैं उनके लिए यह बहुत सुविधाजनक हो सकता है।


जॉन, मुझे यकीन है कि यह एक महान ब्लॉग पोस्ट है, लेकिन चूंकि 17 महीने पहले से स्वीकृत उत्तर है, क्या वास्तव में आपके उत्तर का कोई उद्देश्य है?
जॉन सॉन्डर्स

36
चूँकि यह मेरा पहला स्टैक ओवरफ्लो उत्तर है, जिस तरह से चीजें आमतौर पर नहीं की जाती हैं। Lowy और Bustamante पुस्तकों से परिचित होने के नाते, जो कि महान संदर्भ हैं, मुझे लगता है कि मेरे जवाब उनके द्वारा दिए गए नमूनों से परे हैं। मैं मुख्य रूप से स्टैक ओवरफ्लो का उपयोग करता हूं जब गुग्लिंग करता हूं तो मैं ऐसे पोस्ट पढ़ता हूं जो अक्सर पुराने होते हैं। अधिक उत्तर देने के बाद ही मेरे दृष्टिकोण से मदद मिलती है। पहिये का फिर से आविष्कार करने से बचने के लिए मैंने अपना कोड लिखने से पहले इस पोस्ट को देखा।
जॉन वाइगर

48
एक लगातार एसओ उपयोगकर्ता के रूप में, मुझे पुराने विषयों पर नए पोस्ट पढ़ने के लिए काफी वांछनीय लगता है। यह मुझे अपना काम बेहतर तरीके से करने में मदद करता है, जो इस साइट के मूल्य को बढ़ाता है (जैसा कि खुद और अन्य लोग इसे अधिक देखेंगे)। नियमों के साथ एक स्टिकर होने के बजाय, लोगों को चर्चा करने की अनुमति क्यों नहीं दी जाती ताकि बेहतर उत्तर खोजे जा सकें? क्या यह बात नहीं है?

7
लगता है कि जॉन सॉन्डर्स को उनके स्थान पर उनके स्वयं के प्रश्न की प्रतिक्रिया के साथ रखा गया था (जिनमें से कोई भी उत्तर उन्होंने मेरे द्वारा दिए गए उत्तर के रूप में स्वीकार किया है)। मुझे व्यक्तिगत रूप से सवालों के देर से जवाब के साथ कोई समस्या नहीं है, और आमतौर पर मुझे एक सवाल का नया जवाब देखकर खुशी होती है, जो सालों बाद नहीं। विडंबना यह है कि मैंने इस प्रश्न के अपने स्वीकृत उत्तर के साथ अपना खुद का नेक्रोमैंटर बैज अर्जित किया। :)
devios1

3
मेरे पास एक ही मुद्दा था, और स्वीकृत उत्तर ने मेरी मदद नहीं की, लेकिन यह किया, देर से जवाब देने के लिए तूफान! यदि यह देर से उत्तर के लिए नहीं होता, तो मुझे इसका एक डुप्लिकेट प्रश्न बनाना होगा।
डिडियर ए।

15

यहां, यह पूर्ण और कार्य कोड है। मुझे लगता है कि यह आपकी बहुत मदद करेगा। मैं खोज रहा था और कभी भी एक पूर्ण कोड नहीं पाता है, इसीलिए मैंने पूर्ण और कार्य कोड डालने की कोशिश की। सौभाग्य।

public class ValidatorClass
{
    WSHttpBinding BindingConfig;
    EndpointIdentity DNSIdentity;
    Uri URI;
    ContractDescription ConfDescription;

    public ValidatorClass()
    {  
        // In constructor initializing configuration elements by code
        BindingConfig = ValidatorClass.ConfigBinding();
        DNSIdentity = ValidatorClass.ConfigEndPoint();
        URI = ValidatorClass.ConfigURI();
        ConfDescription = ValidatorClass.ConfigContractDescription();
    }


    public void MainOperation()
    {
         var Address = new EndpointAddress(URI, DNSIdentity);
         var Client = new EvalServiceClient(BindingConfig, Address);
         Client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerTrust;
         Client.Endpoint.Contract = ConfDescription;
         Client.ClientCredentials.UserName.UserName = "companyUserName";
         Client.ClientCredentials.UserName.Password = "companyPassword";
         Client.Open();

         string CatchData = Client.CallServiceMethod();

         Client.Close();
    }



    public static WSHttpBinding ConfigBinding()
    {
        // ----- Programmatic definition of the SomeService Binding -----
        var wsHttpBinding = new WSHttpBinding();

        wsHttpBinding.Name = "BindingName";
        wsHttpBinding.CloseTimeout = TimeSpan.FromMinutes(1);
        wsHttpBinding.OpenTimeout = TimeSpan.FromMinutes(1);
        wsHttpBinding.ReceiveTimeout = TimeSpan.FromMinutes(10);
        wsHttpBinding.SendTimeout = TimeSpan.FromMinutes(1);
        wsHttpBinding.BypassProxyOnLocal = false;
        wsHttpBinding.TransactionFlow = false;
        wsHttpBinding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
        wsHttpBinding.MaxBufferPoolSize = 524288;
        wsHttpBinding.MaxReceivedMessageSize = 65536;
        wsHttpBinding.MessageEncoding = WSMessageEncoding.Text;
        wsHttpBinding.TextEncoding = Encoding.UTF8;
        wsHttpBinding.UseDefaultWebProxy = true;
        wsHttpBinding.AllowCookies = false;

        wsHttpBinding.ReaderQuotas.MaxDepth = 32;
        wsHttpBinding.ReaderQuotas.MaxArrayLength = 16384;
        wsHttpBinding.ReaderQuotas.MaxStringContentLength = 8192;
        wsHttpBinding.ReaderQuotas.MaxBytesPerRead = 4096;
        wsHttpBinding.ReaderQuotas.MaxNameTableCharCount = 16384;

        wsHttpBinding.ReliableSession.Ordered = true;
        wsHttpBinding.ReliableSession.InactivityTimeout = TimeSpan.FromMinutes(10);
        wsHttpBinding.ReliableSession.Enabled = false;

        wsHttpBinding.Security.Mode = SecurityMode.Message;
        wsHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
        wsHttpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
        wsHttpBinding.Security.Transport.Realm = "";

        wsHttpBinding.Security.Message.NegotiateServiceCredential = true;
        wsHttpBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
        wsHttpBinding.Security.Message.AlgorithmSuite = System.ServiceModel.Security.SecurityAlgorithmSuite.Basic256;
        // ----------- End Programmatic definition of the SomeServiceServiceBinding --------------

        return wsHttpBinding;

    }

    public static Uri ConfigURI()
    {
        // ----- Programmatic definition of the Service URI configuration -----
        Uri URI = new Uri("http://localhost:8732/Design_Time_Addresses/TestWcfServiceLibrary/EvalService/");

        return URI;
    }

    public static EndpointIdentity ConfigEndPoint()
    {
        // ----- Programmatic definition of the Service EndPointIdentitiy configuration -----
        EndpointIdentity DNSIdentity = EndpointIdentity.CreateDnsIdentity("tempCert");

        return DNSIdentity;
    }


    public static ContractDescription ConfigContractDescription()
    {
        // ----- Programmatic definition of the Service ContractDescription Binding -----
        ContractDescription Contract = ContractDescription.GetContract(typeof(IEvalService), typeof(EvalServiceClient));

        return Contract;
    }
}

बहुत अच्छा उदाहरण! आप मैन्युअल कॉन्फ़िगरेशन के लगभग हर पहलू को प्रदर्शित करते हैं। अच्छी तरह से किया!
Kilhoffer

5
मुझे समझ नहीं आता कि EvalServiceClient इस कोड में कैसे फिट बैठता है। यह संदर्भित है, लेकिन परिभाषित नहीं है। सर्वर क्लाइंट क्यों बना रहा है?
ब्लूमाँकॉन


3

सभी WCF कॉन्फ़िगरेशन प्रोग्रामिक रूप से किए जा सकते हैं। तो यह एक विन्यास फाइल के बिना दोनों सर्वर और क्लाइंट बनाना संभव है।

मैं Juval Lowy द्वारा "प्रोग्रामिंग WCF सेवाएँ" पुस्तक की सिफारिश करता हूं, जिसमें प्रोग्रामेटिक कॉन्फ़िगरेशन के कई उदाहरण हैं।


2

यह क्लाइंट और सर्वर दोनों तरफ करना बहुत आसान है। जुवल लोवी की पुस्तक के उत्कृष्ट उदाहरण हैं।

विन्यास फाइल के बारे में आपकी टिप्पणी के अनुसार, मैं कहूंगा कि विन्यास फाइल एक गरीब आदमी का दूसरा कोड है। कॉन्फ़िगरेशन फ़ाइलें बहुत बढ़िया होती हैं जब आप हर क्लाइंट को नियंत्रित करते हैं जो आपके सर्वर से कनेक्ट होगा और सुनिश्चित करेगा कि वे अपडेट किए गए हैं, और उपयोगकर्ता उन्हें ढूंढ नहीं सकते हैं और कुछ भी बदल सकते हैं। मुझे लगता है कि WCF कॉन्फ़िगरेशन फ़ाइल मॉडल को सीमित करना, डिजाइन करने के लिए हल्के से मुश्किल और एक रखरखाव दुःस्वप्न है। सब के सब, मुझे लगता है कि यह एमएस द्वारा बहुत ही खराब निर्णय था कि विन्यास फाइल को चीजों को करने का डिफ़ॉल्ट तरीका है।

संपादित करें: कॉन्फ़िगरेशन फ़ाइल के साथ आप जो कुछ नहीं कर सकते हैं, उनमें से एक गैर-डिफ़ॉल्ट निर्माणकर्ताओं के साथ सेवाएं बनाना है। यह WCF में स्थिर / वैश्विक चर और एकल और अन्य प्रकार के गैर-समझ की ओर जाता है।


2

मुझे इस विषय के नीचे लिंक पर ब्लॉग पोस्ट बहुत दिलचस्प लगी।

एक विचार जो मुझे पसंद है वह यह है कि केवल बाध्यकारी या व्यवहार में पास होने या XML अनुभाग को कॉन्फ़िगरेशन से उपयुक्त WCF ऑब्जेक्ट में भेजने में सक्षम होने और इसे गुणों के असाइन करने से निपटने में सक्षम है - वर्तमान में आप ऐसा नहीं कर सकते।

वेब पर दूसरों की तरह मुझे अपने होस्टिंग एप्लिकेशन (जो .NET 2.0 विंडोज सेवा है) की तुलना में एक अलग कॉन्फ़िगरेशन फ़ाइल का उपयोग करने के लिए मेरे WCF कार्यान्वयन की आवश्यकता के आसपास समस्याएं हैं।

http://salvoz.com/blog/2007/12/09/programmatically-setting-wcf-configuration/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.