2010-07-29 9 views
11

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

यहाँ मेरी सेवा अनुबंध है:

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
     <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 

     <services> 
      <service name="MyService"> 
       <endpoint name="mex" address="mex" binding="mexHttpBinding" contract="MyService"/> 
       <endpoint address="rest" behaviorConfiguration="restBehavior" binding="webHttpBinding" contract="MyService" /> 
       <endpoint address="soap" behaviorConfiguration="soapBehavior" binding="basicHttpBinding" contract="MyService" /> 
      </service> 
     </services> 

     <behaviors> 

      <serviceBehaviors> 
       <behavior> 
        <serviceMetadata httpGetEnabled="true"/> 
        <serviceDebug includeExceptionDetailInFaults="true"/> 
       </behavior> 
      </serviceBehaviors> 

      <endpointBehaviors> 
       <behavior name="restBehavior"> 
        <webHttp automaticFormatSelectionEnabled="true" helpEnabled="true" /> 
       </behavior> 
       <behavior name="soapBehavior" /> 
      </endpointBehaviors> 

     </behaviors> 

     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 

    </system.serviceModel> 

    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 

</configuration> 

मैं मार्ग का उपयोग कर रहा मेरी सेवा यूआरएल को परिभाषित करने के:

public class Global : System.Web.HttpApplication 
    { 
     protected void Application_Start(object sender, EventArgs e) 
     { 
      RouteTable.Routes.Add(new ServiceRoute("dns", new ServiceHostFactory(), typeof(MyService))); 
     } 
    } 

वहाँ है

[ServiceContract] 
public interface MyService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate="data/{value}")] 
    string GetData(string value); 
} 

यहाँ मेरी web.config है कुछ ऐसा है जो मैं यहाँ गलत कर रहा हूँ? मेरे द्वारा मदद का वाकई कुछ लाभ उठाया जा सकता था।

+0

मैं भी इस अन्य [प्रश्न/उत्तर] (http://stackoverflow.com/questions/186631/rest-soap-endpoints-for-a-wcf पाया सेवा) सहायक। – SMB

उत्तर

4

मैं "सही" जिस तरह से विन्यास में यह करने के लिए कभी नहीं मिली लेकिन यह पूरा करने के मार्ग इंजन का उपयोग करने में सक्षम था।

मेरे वैश्विक asax फ़ाइल अब इस तरह दिखता है:

public class Global : System.Web.HttpApplication 
    { 
     protected void Application_Start(object sender, EventArgs e) 
     { 
      RouteTable.Routes.Add(new ServiceRoute("my/soap", new ServiceHostFactory(), typeof(MyService))); 
      RouteTable.Routes.Add(new ServiceRoute("my/rest", new WebServiceHostFactory(), typeof(MyService))); 
     } 
    } 

और इस तरह मेरी config: (बाकी मदद पृष्ठों को सक्षम करने)

<system.serviceModel> 

    <standardEndpoints> 
     <webHttpEndpoint> 
      <standardEndpoint automaticFormatSelectionEnabled="true" helpEnabled="true"/> 
     </webHttpEndpoint> 
    </standardEndpoints> 

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 

</system.serviceModel> 

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

मुझे पसंद है कि यह अधिक asp.net MVC के मॉडल के अनुरूप है और थोड़ा config की आवश्यकता है। इसके अतिरिक्त ऐसा करने से मुझे इस परियोजना को पूरी तरह से .svc फ़ाइलों को हटाने की इजाजत दी गई है जो कि एक प्लस आईएमओ भी है।

1

आप अपनी डब्ल्यूसीएफ सेवा कैसे होस्ट कर रहे हैं ?? आईआईएस में, आपको सेवा सक्रियण को सक्षम करने के लिए कहीं वर्चुअल निर्देशिका और MyService.svc फ़ाइल की आवश्यकता है।

आप अभी के लिए ServiceRoute निकालते हैं (मामलों सरल करने के लिए), तो आप पर अपने सोप सेवा समाप्ति बिंदु तक पहुंचने के लिए सक्षम होना चाहिए:

http://YourServer:Port/YourVirtualDirectory/YourService.svc/soap 

और अपने बाकी सेवा होना चाहिए

http://YourServer:Port/YourVirtualDirectory/YourService.svc/rest/data/{value} 

पर (जहां आप {value} के लिए कुछ मनमाना मूल्य प्रदान करते हैं)।

आपके मामले में वास्तव में क्या काम नहीं कर रहा है ??

WCF Test Client का उपयोग करके आप अपने एसओएपी एंडपॉइंट्स को आजमा सकते हैं और परीक्षण कर सकते हैं, जबकि आप किसी भी ब्राउज़र में आरईएसटी यूआरएल को हिट करने में सक्षम होना चाहिए।

+1

मैं आईआईएस में होस्टिंग कर रहा हूं। समस्या यह है कि मैं देखते हैं कि साबुन endpoint केवल पहुँचा जा सकता है अगर यह जड़ यूआरएल पर कॉन्फ़िगर किया गया है: या तो http: // yourserver: पोर्ट/YourVirtualDirectory/YourService.svc या http: // yourserver: पोर्ट/आपकी वर्चुअल डायरेक्टरी/आपकी सेवा (इस पर निर्भर करता है कि मैं सेवा मार्ग का उपयोग करता हूं)। लेकिन अगर मैं इसे इस तरह से कॉन्फ़िगर करता हूं तो शेष अंत बिंदु किसी कारण से पहुंच योग्य नहीं हैं। वैकल्पिक रूप से अगर मैं मूल रूप से वर्णित के रूप में कॉन्फ़िगर करता हूं तो शेष अंत बिंदुएं पहुंच योग्य होती हैं और साबुन अंतराल मुझे 400 त्रुटि देता है। – Troy

+0

मैंने अपनी परियोजना में पूरी तरह से नई सेवा फ़ाइल (.svc) जोड़ने का प्रयास किया। उपरोक्त के समान कॉन्फ़िगरेशन का उपयोग करके सॉर्टा काम करता है ... दोनों आराम और साबुन सेवा .svc url से ठीक काम करती है, लेकिन साबुन सेवा रूट से ही पहुंच योग्य थी। कॉन्फ़िगर किया गया/साबुन पता सम्मानित नहीं किया गया था। – Troy

1

यह विन्यास में करने के लिए संभव है। उपयोगकर्ता Ladislav Mrnka द्वारा MSDN मंच धागा से: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/4e95575f-1097-4190-80dd-7a0f96d73f6e

<system.serviceModel> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="REST"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="iSell.Prospects.ProspectBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service behaviorConfiguration="iSell.Prospects.ProspectBehavior" name="iSell.Prospects.ProspectService"> 
    <endpoint address="" behaviorConfiguration="REST" binding="webHttpBinding" contract="iSell.Prospects.ProspectService" /> 
    <endpoint address="soap" binding="basicHttpBinding" contract="iSell.Prospects.ProspectService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 
</system.serviceModel> 
+1

किसी को भी काम करने की कोशिश करने के लिए संकेत दें। आपका साबुन यूआरआई इस तरह दिखेगा: 'http: // host/myService.svc/साबुन /' – dummy

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