2010-05-27 10 views
21

मैं एक्सटेंशन-कम/.svc-कम WCF सेवाओं का उपयोग करने का प्रयास कर रहा हूं। क्या कोई और समस्या का सामना कर रहा है या उस मुद्दे को अस्वीकार कर सकता है?सर्विस रूट + WebServiceHostFactory WSDL पीढ़ी को मारता है? विस्तारित डब्ल्यूसीएफ सेवा कैसे बनाएं? Wsdl

मैं global.asax.cs के कोड में मार्ग का उपयोग करें, और यह करने के Application_Start में:

RouteTable.Routes.Add(new ServiceRoute("Data", new WebServiceHostFactory(), typeof(DataDips))); 

मैं दोनों IIS 6 में परीक्षण किया है और IIS 7.5 है और मैं सेवा ठीक उपयोग कर सकते हैं (यानी मेरी एक्सटेंशन-कम वाइल्डकार्ड मैपिंग हैंडलर कॉन्फ़िगरेशन एएसपी.नेट पर सही ढंग से इंगित किया गया है)। हालांकि, मेटाडाटा पीढ़ी पूरी तरह से खराब हो गई है। I डब्ल्यूसीएफ टेस्ट क्लाइंट (और मैं svcutil.exe) के साथ मेरा/मैक्स एंडपॉइंट हिट कर सकता हूं - लेकिन? Wsdl पीढ़ी जिसे आप आम तौर पर प्राप्त करते हैं। एसवीसी टोस्ट है। मैं इसे ब्राउज़र के साथ नहीं मार सकता (400 खराब अनुरोध प्राप्त करें), मैं इसे wsdl.exe आदि से नहीं मार सकता। मेटाडाटा पीढ़ी web.config में सही तरीके से कॉन्फ़िगर किया गया है।

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

मैं बजाय बजाय कोड में एक मार्ग को पंजीकृत करने से इस तरह config में serviceActivation मार्ग का उपयोग करते हैं,:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
    <serviceActivations> 
    <add relativeAddress="Data.svc" service="DataDips" /> 
    </serviceActivations> 
</serviceHostingEnvironment> 

तो देखा ... यह काम करता है।

लेकिन तब मेरे पास एक साफ़ विस्तार रहित यूआरएल नहीं है। यदि मैं Data.svc से डेटा में सापेक्ष एड्रेस बदलता हूं, तो मुझे कॉन्फ़िगरेशन अपवाद मिलता है क्योंकि यह कॉन्फ़िगरेशन द्वारा समर्थित नहीं है। (डब्ल्यूसीएफ में पंजीकृत एक एक्सटेंशन का उपयोग करना चाहिए)।

मैं भी ऊपर config के साथ संयोजन के रूप में इस कोड का उपयोग करने का प्रयास किया:

RouteTable.Routes.MapPageRoute("","Data/{*data}","~/Data.svc/{*data}",false); 

मेरे सोच है कि मैं सिर्फ .svc कॉन्फ़िगर किया गया यूआरएल पर extensionless यूआरएल बात कर सकते हैं। यह काम नहीं करता है - /Data.svc काम करने के लिए जारी है, लेकिन/डेटा ऊपर serviceActivation साथ देता है एक 404.

मैं एक काम के आसपास मिला है, तो इस तरह config में urlMappings का उपयोग कर संयोजन के रूप में,:

<urlMappings> 
    <add url="~/Data" mappedUrl="Data.svc"/> 
</urlMappings> 
इस के साथ समस्या यह

दोहरा है - 1. यह 2. घुमावदार लगता उत्पन्न डबल्यूएसडीएल में, आपरेशन अंतिम बिंदुओं अभी भी Data.svc का उल्लेख/के बजाय डेटा/- इसलिए निर्भरता Data.svc पर theres वास्तव में मौजूदा/प्रतिक्रिया।

यह वास्तव में वही नहीं है जो मैं चाहता हूं, भले ही यह थोड़ी/समस्या हल करे।

क्या डब्लूएसडीएल उत्पन्न करने के लिए विस्तार से कम डब्ल्यूसीएफ सेवा यूआरएल प्राप्त करने का कोई उचित तरीका है?

+0

यहाँ चरण-दर-चरण निर्देश: http://stackoverflow.com/a/27850224/276949 –

उत्तर

35

वाह, क्या मुझे गूंगा लगता है।

मुझे सेवाहोस्ट फैक्टरी के साथ मेरी सेवा होस्ट करनी चाहिए, न कि WebServiceHostFactory।

जैसे ही मैं कॉन्फ़िगरेशन से कोड पर वापस चला गया ...और कोड की इस पंक्ति को लगा दिया:

RouteTable.Routes.Add(new ServiceRoute("Data", new ServiceHostFactory(), typeof(DataDips))); 

मैं एक extensionless यूआरएल WSDL और मदद पृष्ठों की सेवा के साथ व्यापार में था।

यह बहुत बुरा है कि मैंने इस पर इतना समय बर्बाद कर दिया। यह एक दुर्घटना थी कि मैं WebServiceHostFactory का उपयोग कर रहा था, लेकिन कम कार्यक्षमता के बारे में एमएसडीएन में फैक्ट्री पेज पर कोई अस्वीकरण नहीं है। (मैं तर्क दूंगा कि डब्लूएसडीएल को हटाने से समझ में आता है, लेकिन हेल्प पेजों को हटाया जाता है क्योंकि वे 'सहायता' पृष्ठ का नाम बदलने के लिए कॉन्फ़िगर में एक विशेषता प्रदान नहीं कर सकते हैं, उस नाम के साथ एक आरईएसटी ऑपरेशन होना चाहिए ... sigh)।

WebServiceHost डॉक्स http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webservicehost.aspx

+1

अभी भी एक वैध सवाल है। मैंने अभी यह वही काम किया है, और यहां जवाब का जवाब मेरे लिए इंतजार कर रहा है। धन्यवाद! –

+0

हां, एक वैध सवाल है। मैं वही काम करना चाहता था और यह एक इलाज किया। – JTew

+5

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

0

मैं एक ही मुद्दा है में एक नोट है। आपका समाधान मेरे कोड पर काम करता है। मैं सिर्फ इस तरह Global.asax बदल दिया है:

<%@ Application Language="C#" %> 
<%@ Import Namespace="System.Web.Routing" %> 
<%@ Import Namespace="System.ServiceModel.Activation" %> 
<%@ Import Namespace="System.ServiceModel.Web " %> 

<script RunAt="server"> 
    void Application_Start(object sender, EventArgs e) 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 

    private void RegisterRoutes(RouteCollection routes) 
    { 
     routes.Add(new ServiceRoute("URLWithoutSVC", new WebServiceHostFactory(), typeof(Service))); 
    } 
</script> 

करने के लिए

<%@ Application Language="C#" %> 
<%@ Import Namespace="System.Web.Routing" %> 
<%@ Import Namespace="System.ServiceModel.Activation" %> 
<%@ Import Namespace="System.ServiceModel.Web " %> 

<script RunAt="server"> 
    void Application_Start(object sender, EventArgs e) 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 

    private void RegisterRoutes(RouteCollection routes) 
    { 
     routes.Add(new ServiceRoute("URLWithoutSVC", new ServiceHostFactory(), typeof(Service))); 
    } 
</script> 
संबंधित मुद्दे