2012-07-18 12 views
9

मैं जो बाकी सेवाओं के लिए अनुरोध स्वीकार करता है और XML या JSON के साथ प्रतिक्रिया सी # में बनाया गया एक कस्टम HTTP सर्वर मिल गया है (पर निर्भर करता है क्या ग्राहक की जरूरत है)। आरईएसटी सेवाओं को डेटाबेस-आधारित कॉन्फ़िगरेशन से रनटाइम पर परिभाषित किया जाता है, इनपुट पैरामीटर और आउटपुट प्रकारों में व्यापक रूप से भिन्न होता है, और यह उत्पादन में खूबसूरती से काम कर रहा है।बनाना और सी # में गतिशील रूप से एक सोप सेवा और इसके डबल्यूएसडीएल उजागर (एक कस्टम टीसीपी श्रोता के साथ!)

हालांकि, मैं एक ही सेवाओं के लिए साबुन का उपयोग जोड़ने के लिए, उचित WSDLs के साथ भी करना चाहते हैं। के बाद से उपलब्ध सेवाओं हार्ड-कोडेड नहीं कर रहे हैं, इसका मतलब है:

  • एक डबल्यूएसडीएल डेटाबेस
  • में विधि परिभाषाओं भेजे सोप अनुरोध पार्स से क्रम में उत्पन्न प्रकाशित कर रहा है, उन्हें उन परिभाषाओं की मैपिंग, और सुनिश्चित करते हुए अनुरोधों, उन्हें
  • से निपटने एक बार प्रतिक्रिया नियंत्रित किया जाता है से पहले विधि हस्ताक्षर के अनुरूप एक सोप प्रतिक्रिया बैठक वेब उत्पन्न करने के लिए दृश्य स्टूडियो का उपयोग कर परिणाम
  • वापस जाने के लिए

एमएस प्रलेखन (और Google) दस्तावेजों WDSL बनाने servi सीईएस (और WSDLs) डिजाइन समय में, सामान उजागर webMethods का उपयोग कर, ASP.NET MVC आदि यह नहीं है कि मैं क्या देख रहा हूँ, के रूप में वहाँ कोई विधि परिभाषाओं जहाँ से डिजाइन समय में बाइंडिंग उत्पन्न करने के लिए कर रहे हैं।

किसी को डायनामिक रूप से तैयार विधि हस्ताक्षर, आदि से किसी भी विचार (कच्चे सोप पार्सिंग के लिए जैसे उपकरणकिटें), और WSDLs की पीढ़ी पर विचार है? कोई विचार नहीं कि कोई ऐसी चीजों के निर्माण के बारे में कैसे जा सकता है यदि नहीं? यदि संभव हो तो मैं पहिया को पुन: आविष्कार से बचने के लिए देख रहा हूं।

पुनश्च: जाहिर है इसके लिए नेट ढांचे में मानकीकृत सामान है, के बाद से दृश्य स्टूडियो आप के लिए यह करता है - किसी भी विचार कैसे एक निचले स्तर पर पहुँचने के लिए जो रनटाइम के दौरान,?

+1

_ के बीच भेजे गए SOAP (xml) प्रारूप के बारे में एक विचार दे सकता है _ "आरईएसटी सेवाओं को डेटाबेस-आधारित कॉन्फ़िगरेशन से रनटाइम पर परिभाषित किया गया है" _ - मैंने इसे पढ़ते समय shivered। क्या यह एक रखरखाव और समस्या निवारण नरक नहीं है? – CodeCaster

+0

मैं एक बहुत ही समान स्थिति से निपट रहा हूं कि क्या स्वीकार्य उत्तर आपके लिए –

+0

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

उत्तर

6

गतिशील रूप से एक wsdl बनाने के लिए आप ServiceDescriptionReflector

उदाहरण के लिए उपयोग कर सकते हैं: कक्षा

के लिए
public class TestWebService 
{ 
    [WebMethod] 
    public string Hello(string namex) 
    { 
     return "Hello " + namex; 
    } 
} 

आप

StringWriter wr = new StringWriter(); 
var r = new System.Web.Services.Description.ServiceDescriptionReflector(); 
r.Reflect(typeof(TestWebService), "http://somewhere.com"); 
r.ServiceDescriptions[0].Write(wr); 
var wsdl = wr.ToString(); 

इस कोड का उपयोग कर सकते हैं लेकिन जब से तुम कहा है

प्रकाशक गा डबल्यूएसडीएल

डेटाबेस में विधि परिभाषाओं से क्रम में उत्पन्न आप रनटाइम पर Type बनाने के लिए

var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("MyAsm"), AssemblyBuilderAccess.Run); 
var mod = asm.DefineDynamicModule("MyModule"); 

TypeBuilder typeBuilder = mod.DefineType("TestWebService"); 

MethodBuilder mb = typeBuilder.DefineMethod("Hello", MethodAttributes.Public, CallingConventions.Standard, typeof(string), new Type[] { typeof(string) }); 
var cab = new CustomAttributeBuilder(typeof(WebMethodAttribute).GetConstructor(new Type[]{}), new object[]{}); 
mb.SetCustomAttribute(cab); 
mb.DefineParameter(1, ParameterAttributes.In, "namex"); 
mb.GetILGenerator().Emit(OpCodes.Ret); 

Type type = typeBuilder.CreateType(); 

अब आप type का उपयोग wsdl

StringWriter wr = new StringWriter(); 
var r = new System.Web.Services.Description.ServiceDescriptionReflector(); 
r.Reflect(type, "http://somewhere.com"); 
r.ServiceDescriptions[0].Write(wr); 
var wsdl = wr.ToString(); 

बनाने के लिए पढ़ने के लिए कर सकते हैं अनुरोध और प्रतिक्रिया बनाने, आप Linq2Xml का उपयोग कर सकते हैं। Fiddler आपको क्लाइंट और सर्वर

+0

यह बढ़िया है - मुझे पहले से ही प्रकार की रचना को हल किया गया है, लेकिन सेवा डिस्क्रिप्शन रिफ्लेक्टर बिल्कुल वही था जो मैं ढूंढ रहा था। धन्यवाद! –

2

सोप "बस" एक सूचना आदान-प्रदान के लिए XML- आधारित प्रोटोकॉल है। ग्राउंड अप से इसके लिए समर्थन लागू करना कठिन होगा लेकिन सिद्धांत रूप में जटिल रूप से जटिल नहीं है, मुझे नहीं लगता।

आधिकारिक सोप विनिर्देशों here पाया जा सकता है।

+0

यह ज्यादातर टेडियम (और बग्स के लिए संभावित) है, इसलिए मैं बचाना चाहता हूं - बल्कि एसओएपी पार्सिंग को संभालने के लिए किसी प्रकार की टूलकिट की उम्मीद कर रहा हूं। मुझे पता है कि माइक्रोसॉफ्ट के पास लगभग 10 साल पहले उनका एसओएपी टूलकिट था, लेकिन इसे छोड़ दिया गया था वीएस सबकुछ प्रबंधित ... धन्यवाद, यद्यपि! –

2

सोप पार्स न करें जब तक आप वास्तव में करने के लिए, WCF करने दे सकते हैं आप के लिए भारी उठाने करते हैं, अपने परिभाषाओं से सी # कोड में सेवा-और datacontracts पैदा करते हैं और क्रम पर संकलित करें। एक सेवा कार्यान्वयन उत्पन्न करें जो एक प्रसिद्ध इंटरफ़ेस के माध्यम से आपके "स्थिर" कोड में हुक करता है।

गतिशील रूप से नई सेवा अनुबंध/डेटा अनुबंध के लिए सही बाध्यकारी साथ अंतिमबिंदुओं पैदा करते हैं। यदि बाइंडिंग गतिशील रूप से परिवर्तित नहीं होते हैं तो यह आपको app.config में परिभाषित किया जा सकता है अन्यथा इसे रनटाइम में भी सेट करें।

wsdl प्रकाशित पाने के लिए एक मेक्स endpoint जोड़ें।

के लिए "की जांच" आने वाले ट्रैफ़िक एक MessageInspector

स्वयं ServiceHost का उपयोग कर अपने HTTP सर्वर में WCF/सोप सेवा की मेजबानी का उपयोग ->Self Hosting WCF

एक और दृष्टिकोण पर बस कुछ विचार।

+0

यह संभवतः मेरे मूल प्रश्न से पर्याप्त स्पष्ट नहीं है, लेकिन दोनों डेटा अनुबंध और बाइंडिंग * रनटाइम पर बदलते हैं, इसलिए मैं डब्ल्यूसीएफ का उपयोग नहीं कर रहा हूं। यह यहां उपयोग का मामला है - गैर-डब्ल्यूसीएफ/आईआईएस सर्वर और अनुबंध जो रनटाइम पर बदलते हैं (और अक्सर बनाए जाते हैं)। –

+0

यदि अनुबंध और बाइंडिंग दोनों बदलते हैं तो आपके ग्राहक आपकी सेवा का उपयोग कैसे करते हैं? सेवा का पता लगाने में मुश्किल होनी चाहिए? –

+0

मुझे डायनामिक कॉन्ट्रैक्ट बिट मिला और यह कॉन्ट्रैक्ट्स को गतिशील रूप से उत्पन्न करके संबोधित किया गया है, क्योंकि होस्टिंग के लिए आप सर्विसहोस्ट http://msdn.microsoft.com/en-us/ का उपयोग कर अपने HTTP सर्वर में डब्ल्यूसीएफ/एसओएपी सेवा को स्वयं होस्ट कर सकते हैं। लाइब्रेरी/एमएस 730158.aspx। –