2010-04-19 17 views
5

इसलिए मेरे पास वर्तमान में 2 समाधान हैं जो मेरे समाधान में सेवा संदर्भ के रूप में जोड़े गए हैं। वे (, मैं "बाइंडिंग" क्षेत्र निकाल दिया क्योंकि वह अरुचिकर है) की तरह यह मेरा app.config फ़ाइल में देखो:रनटाइम पर पता/डब्लूएसडीएल एंडपॉइंट एड्रेस का पता बदलें?

using (DataService.DataClient dClient = new DataService.DataClient()) 
{ 
    DataService.importTask impt = new DataService.importTask(); 
    impt.String_1 = "someData"; 
    DataService.importResponse imptr = dClient.importTask(impt); 
} 

:

<system.serviceModel> 
    <client> 
    <endpoint address="http://localhost:8080/query-service/jse" binding="basicHttpBinding" bindingConfiguration="QueryBinding" contract="QueryService.Query" name="QueryPort" /> 
    <endpoint address="http://localhost:8080/dataimport-service/jse" binding="basicHttpBinding" bindingConfiguration="DataImportBinding" contract="DataService.DataImport" name="DataImportPort" /> 
    </client> 
</system.serviceModel> 

जब मैं एक डबल्यूएसडीएल का उपयोग, यह कुछ इस तरह दिखता "उपयोग" कथन में, डेटा क्लाइंट ऑब्जेक्ट को तुरंत चालू करते समय, मेरे पास 5 कन्स्ट्रक्टर उपलब्ध हैं।

new DataService.DataClient() 

जो निर्मित Endpoint पता स्ट्रिंग है, जो मुझे लगता है app.config से खींचा जाता है का उपयोग करता है: इस परिदृश्य में, मैं डिफ़ॉल्ट निर्माता का उपयोग करें। लेकिन मैं चाहता हूं कि एप्लिकेशन के उपयोगकर्ता को इस मान को बदलने का विकल्प हो।

1) प्रोग्रामिंग रूप से इस स्ट्रिंग को प्राप्त करने का सबसे अच्छा/आसान तरीका क्या है?

2) फिर, एक बार जब मैंने उपयोगकर्ता को मूल्य संपादित करने और परीक्षण करने की अनुमति दी है, तो मुझे इसे कहां स्टोर करना चाहिए?

मैं इसे किसी स्थान (जैसे app.config या समकक्ष) में संग्रहीत करना पसंद करूंगा ताकि यह जांचने की कोई आवश्यकता न हो कि मूल्य मौजूद है या नहीं और क्या मुझे वैकल्पिक कन्स्ट्रक्टर का उपयोग करना चाहिए या नहीं। (मेरा कोड कसकर रखना चाहते हैं, या पता है?)

कोई विचार? सुझाव?

संपादित

शायद मैं इन वैकल्पिक कंस्ट्रक्टर्स के बारे में रूप में अच्छी तरह से पूछना चाहिए।

क्या मूल्यों "endPointConfigurationName" और "remoteAddress" के लिए पारित हो सकता है:

उदाहरण के लिए, उनमें से एक इस तरह दिखता है?

EDIT2

यहाँ मेरे अपने प्रश्नों का उत्तर देना, "endPointConfigurationName" "नाम" app.config एक्सएमएल में और "remoteAddress" के रूप में ही रूप में "अंत बिंदु का पता एक ही स्वरूपित है प्रतीत होता है "app.config एक्सएमएल में।

भी!

ClientSection clSection = 
    ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection; 

ChannelEndpointElementCollection endpointCollection = 
    clSection.ElementInformation.Properties[string.Empty].Value as ChannelEndpointElementCollection; 

Dictionary<string, string> nameAddressDictionary = 
    new Dictionary<string, string>(); 

foreach (ChannelEndpointElement endpointElement in endpointCollection) 
{ 
    nameAddressDictionary.Add(endpointElement.Name, 
          endpointElement.Address.ToString()); 
} 

EDIT3

ठीक है, मैं मेरी समस्या को लगता है कि मैं समझ गए होंगे 2 आधा (और इस प्रकार, पूर्ण समाधान): EndPointAddresses करने के बारे में मेरा पहला सवाल का जवाब निम्नलिखित है । इस कोड के साथ

Configuration configuration; 
ServiceModelSectionGroup serviceModelSectionGroup; 
ClientSection clientSection; 

configuration = 
    ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
serviceModelSectionGroup = 
    ServiceModelSectionGroup.GetSectionGroup(configuration); 
clientSection = serviceModelSectionGroup.Client; 

foreach (ChannelEndpointElement endPt in clientSection.Endpoints) 
{ 
    MessageBox.Show(endPt.Name + " = " + endPt.Address); 
} 
configuration.Save(); 

, हम clientSection.Endpoints की पहुंच है और पहुँच सकते हैं और सभी सदस्य गुण बदल सकते हैं, जैसे "पता": मैं किसी अन्य वेबसाइट पर इस मिल गया है और मैं इसे संशोधित मेरी जरूरतों को पूरा करने। और फिर जब हम उन्हें बदल रहे हैं, हम कॉन्फ़िगरेशन कर सकते हैं। सहेजें() और सभी मान उपयोगकर्ता फ़ाइल में लिखे गए हैं।

अब यहां पकड़ है।डीबग मोड में, "config.save()" वास्तव में निष्पादन से निष्पादन तक आपके मानों को जारी रखने के लिए प्रकट नहीं होता है, लेकिन जब अनुप्रयोग सामान्य (डीबग मोड के बाहर) चलाते हैं, तो मान जारी रहता है। (जो अच्छा है।) तो यह एकमात्र चेतावनी है।

EDIT4

एक और चेतावनी है। डब्लूएसडीएल में किए गए परिवर्तन रनटाइम के दौरान प्रभावी नहीं होते हैं। आवेदन स्मृति में उपयोगकर्ता कॉन्फ़िग फ़ाइल मूल्यों को फिर से पढ़ने के लिए पुनः प्रारंभ करना होगा (जाहिरा तौर पर।)


केवल दूसरी बात यह है कि मैं रुचि हो सकती है में एक तरह से लग रहा है (एक बार मान बदल दिया गया है) मूल्यों को उनके डिफ़ॉल्ट पर वापस करने के लिए। निश्चित रूप से, आप शायद उपयोगकर्ता फ़ाइल को हटा सकते हैं, लेकिन यह सभी कस्टम सेटिंग्स को हटा देता है।

कोई विचार?

EDIT5

मैं सोच रहा हूँ निर्भरता इंजेक्शन यहाँ सही हो सकता है, लेकिन अधिक यह अनुसंधान करने के लिए जरूरत है ...

संपादित 6

मैं टिप्पणी विशेषाधिकार नहीं हैं लेकिन आप

ConfigurationManager.RefreshSection("client"); 

कैश अपडेट करने के लिए चलाने की आवश्यकता है ताकि परिवर्तन तुरंत हो जाएं।

उत्तर

2

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

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

Here's an excellent article

कस्टम पते को संग्रहीत करने के लिए, यह आपके ऐप पर निर्भर करेगा कि यह सिल्वरलाइट, विंडोज या वेब ऐप है या नहीं। मेरी व्यक्तिगत पसंद डेटाबेस है।

+0

मैं फिर से उस लेख को पढ़ूंगा (मेरी आंखें लेख के आधे रास्ते पर आंखों से घूमने लगीं ...) लेकिन मैं असहमत हूं: यह * काफी * मुश्किल है। विशेष रूप से इस बात पर विचार करते हुए कि मुझे मुश्किल से पता है कि इन डब्ल्यूएसडीएल क्या कर रहे हैं। और मेरे पास 22 डब्ल्यूएसडीएल हो सकते हैं जो मुझे अंततः एकीकृत करना होगा। "सेवा संदर्भ जोड़ें" अद्भुत जादू था। निश्चित रूप से सीमित, लेकिन इसमें अद्भुत है कि यह मेरी परियोजना जल्दी से जा रहा है। (मैं आपको वैसे भी एक +1 दूंगा, क्योंकि यह एक अच्छा खोज है। धन्यवाद!) – Pretzel

+0

हाँ, मुझे एहसास है कि मैं आलसी प्रोग्रामर की तरह लग रहा हूं। क्या हम सब कुछ हद तक नहीं हैं? :-) मैं कसम खाता हूं कि मैं इस पर कुछ और शॉट ले जाऊंगा, लेकिन ऐसा लगता है कि मैं सिविल इंजीनियरिंग और आर्किटेक्चर में डिग्री प्राप्त करने की कोशिश कर रहा हूं, बस अपने पिछवाड़े में एक ढेर बनाने के लिए। हाँ जानता हूं? – Pretzel

+0

@Pretzel - अच्छा दुख, 22 संदर्भ! उस स्थिति में एक त्वरित और गंदा समाधान है जिसे मैंने अतीत में उपयोग किया है। आंशिक कक्षाओं का लाभ उठाने का प्रयास करें। इस विचार में ऑटो जेनरेट किए गए लोगों के लिए आंशिक कक्षा होगी ताकि आप सेवा संदर्भ अद्यतन पर अपना कोड न खोएं। यद्यपि आप एक चौराहे पर किसी भी तरह से हैं। या तो माइक्रोसॉफ्ट जेनरेट कोड को सीखें और विच्छेदन करें, या अपना खुद का लिखें। भ्रामक जानकारी के लिए – Matt

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