2012-06-18 12 views
5

मैं इस ट्यूटोरियल का पालन किया (कम से कम इस में मेरी WCF आधारित है, coz मैं तो जरूरत है एक जैसे काम करने के लिए): http://www.eggheadcafe.com/tutorials/wcf/b5ada8df-58c5-492f-b368-457b3a4f137c/notify-client-applications-using-wcf-callbacks.aspxइंटरनेट पर डब्ल्यूसीएफ ड्यूल सेवा का उपयोग कैसे करें?

यह मेरे कंप्यूटर पर बहुत अच्छी तरह से काम कर रहा है, लेकिन मैं इंटरनेट पर इसका इस्तेमाल करने की जरूरत है। ऐसा करने की कोशिश करते समय मैंने सुना (इंटरनेट पर) जो NetTcpBiding का उपयोग करना बेहतर है।

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

अगर कोई मेरी मदद कर सकता है तो मुझे बहुत प्रसन्नता होगी।

अग्रिम धन्यवाद,

संपादित करें:

अपने आप को स्पष्ट करना: मैं सिर्फ यह इंटरनेट पर काम नहीं कर सके। क्या आप लोग मुझे दिखा सकते हैं कि मैं netTcp बाइंडिंग का उपयोग करने और इंटरनेट पर काम करने के लिए अपनी कॉन्फ़िगरेशन (Web.config e App.config) कैसे बदल सकता हूं?

एक बार फिर धन्यवाद,

संपादित करें 2:

मेरी WCFServiceApplication में मेरे Web.config है:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IPCWatcherWCFService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFServiceBehavior" name="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFService"> 
     <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPCWatcherWCFService" contract="TiT.PCWatcher.Server.WCFService.Interfaces.IPCWatcherWCFService"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 
मेरी WindowsService में

मेरे App.config है:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IPCWatcherWCFService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" 
      textEncoding="utf-8" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:25145/Services/PCWatcherWCFService.svc" 
     binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPCWatcherWCFService" 
     contract="PCWatcherWCFServiceReference.IPCWatcherWCFService" 
     name="WSDualHttpBinding_IPCWatcherWCFService"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration> 

बस इसे netTcp बाइंडिंग में बदलना काम नहीं करता है ...

लेकिन मुझे इंटरनेट पर इसे चलाने में सक्षम होने के लिए पर्याप्त खुशी होगी ... मैंने आईआईएस पर डब्ल्यूसीएफएस सेवा प्रकाशित की। लिंक:

https://www2.tcenter.com.br/monitor/PCWatcherWCFService.svc

या

http://www2.tcenter.com.br:8080/monitor/PCWatcherWCFService.svc

बस कॉन्फ़िगरेशन यह इंटरनेट के माध्यम से काम करने के लिए अपने enought बदलते? जैसे मैंने कहा, स्थानीय यह ठीक काम करता है।

मैंने सोचा था कि बस यूआरएल से एक के लिए ग्राहक पर endpoint पता बदलने कि ऊपर यह काम whould, लेकिन ऐसा नहीं किया ...

उदाहरण है कि आप मेजबान जुड़ा हुआ WPF पर सेवा। मुझे नहीं पता कि यह मेरे सीनेरियो पर लागू होता है ...

मुझे लगता है कि मैं ड्यूलहट्प बाइंडिंग के साथ रहना चाहता हूं, आपको नहीं लगता कि बंदरगाह अग्रेषित करना मेरी आवश्यकताओं के लिए अच्छा है, मैं बहुत कुछ कर सकता हूं एक इंट्रानेट में ग्राहकों का और राउटर होने का निर्णय लेता है कि वह इसके लिए जानकारी भेजने जा रहा है, इसका कोई अच्छा अधिकार नहीं है? या राउटर को एक ही बंदरगाह के माध्यम से मेरे वेबसर्वर को मिलने वाली प्रत्येक मशीन को गहराई से प्रतिक्रिया देने का एक तरीका है ?!(सिर्फ पूछ, hehehe)

अग्रिम धन्यवाद एक बहुत,

21/06/2012 पर संपादित करें:

पढ़ने के लिए धन्यवाद। मैं लैन में netTcp बाइंडिंग के साथ काम करने के लिए सेवा प्राप्त करने में सक्षम नहीं था। मैंने अपने सीनेरियो का नकली नमूना किया था। यह here है। ड्यूल कॉम्यूनिकेशनटेस्ट कहा जाता है।

जब मैंने यह पोस्ट शुरू किया, तो मैं सिर्फ यह जानना चाहता था कि इस सीनेरियन को इंटरनेट पर कैसे चलाना है। बस कि। मेरे पोस्ट के दौरान यहां पोस्ट करने से पहले समाधान खोजने के दौरान, मैंने पढ़ा कि netTcp बाइंडिंग बेहतर है। तो मैंने इसके बारे में पूछा। यह सिर्फ एक पक्ष सवाल था।

तो ... पोस्ट पर मेरे वर्तमान जरूरतों हैं:

इंटरनेट पर the sample i developed का उपयोग कैसे करें।

या

कैसे netTcpBinding साथ the sample i developed काम करने और फिर इंटरनेट पर इसका इस्तेमाल करने में सक्षम हो। (मुझे यकीन है कि Clunky Coder ने मुझे आईआईएस और सामान के साथ इंटरनेट पर net.tcp प्रकाशित करने के तरीके पर दूसरा भाग सिखाया, इसके लिए बहुत बहुत धन्यवाद, लेकिन मैं अभी तक इसका परीक्षण करने में सक्षम नहीं था, क्योंकि मैं ' टी अभी तक netTcp करें।)

मुझे खेद है कि अगर मैं पर्याप्त स्पष्ट नहीं हूं, तो मेरी अंग्रेजी इतनी अच्छी नहीं है। श्रीमान और फिर से धन्यवाद, बहुत कुछ।

उत्तर

5

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

इंटरनेट पर द्वैध संचार के लिए सामान्य तौर पर आप WSDualHttpBinding है और यदि आप एक Silverlight ग्राहक है (Silverlight WSDualHttpBinding समर्थन नहीं करता) आप PollingDuplexHttpBinding उपयोग कर सकते हैं।

मैं आपको this पढ़ने की भी सलाह देता हूं।

संपादित करें:

कि उदाहरण netTcpBinding उपयोग करने के लिए, बस कॉन्फ़िग फ़ाइल में बाइंडिंग बदलने wsDualHttpBinding के बजाय netTcpBinding उपयोग करने के लिए बदलने के लिए। this article पर एक नज़र डालें, यह आपके द्वारा पोस्ट किया गया लिंक करता है, netTcpBinding और अधिक स्पष्टीकरण के साथ।

संपादित 20/06/2012:

अपने आप को स्पष्ट करना: मैं सिर्फ यह इंटरनेट पर काम नहीं कर सके। क्या आप लोग मुझे दिखा सकते हैं कि मैं netTcp बाइंडिंग का उपयोग करने और इंटरनेट पर काम करने के लिए अपनी कॉन्फ़िगरेशन (Web.config e App.config) कैसे बदल सकता हूं?

लगता है कि आप लैन में netTcpBinding के साथ काम करने के लिए सेवा प्राप्त करने में सक्षम थे, इसलिए अपने पहले समस्या अब तय हो गई है और अब आप मुसीबत IIS में सेवा की मेजबानी में समस्या आ रही है और यह ऑनलाइन प्रकाशित करने। जब आपकी सेवा एक लैन में काम करती है, तो यह आईआईएस में होस्ट करने के बाद इंटरनेट पर काम करेगी और ग्राहकों और सर्वर राउटर पर उचित बंदरगाहों को अग्रेषित करेगी, यह एक आम परिदृश्य है और इसे अच्छी तरह से ऑनलाइन दस्तावेज किया गया है। ऐसा करने के लिए आपको अपनी आईआईएस वेबसाइट में एक आवेदन के रूप में अपनी सेवा होस्ट करनी होगी। आपको यह सुनिश्चित करने की ज़रूरत है कि आपकी सेवा में एक .svc फ़ाइल है जो सेवा के स्थान पर इंगित करती है, फिर एप.कॉन्फिग (सेवा कॉन्फ़िगरेशन फ़ाइल) की सामग्री को एक नए web.config पर कॉपी करें (उसी भौतिक निर्देशिका में आपके जैसा App.config) और नए बनाए गए web.config में <host><baseAddresses> अनुभाग को भी हटाएं, एप्लिकेशन के भौतिक पथ को अपने सेवा होस्ट कंप्यूटर पर इस सेवा के स्थान पर इंगित करें। एक बार इसकी देखभाल करने के बाद, netTcpBinding के लिए अपनी सेवा का उपयोग करने वाली विशिष्ट बाइंडिंग को सक्षम करने के लिए डिफ़ॉल्ट वेबसाइट बाइंडिंग को संपादित करना सुनिश्चित करें: वेबसाइट -> 'बाइंडिंग संपादित करें ...' -> 'जोड़ें ...' फिर नेट चुनें । टीसीपी और इसे बंदरगाहों को असाइन करें। फिर अपने एप्लिकेशन पर 'उन्नत सेटिंग्स' पर जाएं और net.tcp सक्षम करें, netTcpBinding सेवा आमतौर पर http,net.tcp सक्षम प्रोटोकॉल के रूप में होगी। यदि आप teething त्रुटियों में भाग लेते हैं तो सुनिश्चित करें कि डिफ़ॉल्ट ऐप पूल (या जो भी आपकी वेबसाइट का उपयोग कर रहा है) में सर्वर पर भौतिक निर्देशिका को एक्सेस करने और पढ़ने के लिए आवश्यक अनुमतियां हैं, जिसमें सेवा रहती है।

कृपया this और this पढ़ें, मुझे विस्तार से पूछने के लिए कि वे क्या कह रहे हैं दोहराएंगे।

संपादित 21/06/2012:

मैं सिर्फ आपकी सेवा डाउनलोड और IIS में यह आयोजन किया है और यह ठीक होस्ट किया गया है, इसके का उपयोग कर के बाद से HTTP और फिर nettcp नहीं मतलब है कि यह इंटरनेट पर पूरी तरह से ठीक काम करता है। यदि आपकी सेवा कुछ सरल है और आप इसके साथ भारी प्रसंस्करण करने की उम्मीद नहीं करते हैं (इसके द्वारा आप बस उससे जुड़े ग्राहकों की सूची प्राप्त करने की कोशिश कर रहे हैं) तो HTTP प्रोटोकॉल में काम करने के बाद wsDualHTTPBinding के साथ चिपके रहें किसी भी पर्यावरण और आपको netTcpBinding के साथ फ़ायरवॉल के बारे में चिंता करने की ज़रूरत नहीं है।यह सब मैं आईआईएस में सेवा की मेजबानी (और यह इंटरनेट पर उपलब्ध बनाने) के लिए क्या किया है:

  1. जाओ IIS में DefaultWebsite करने के लिए, ठीक है, क्लिक करें, अनुप्रयोग जोड़ने उर्फ ​​तहत सिर्फ अपने सेवा किसी भी नाम आप चाहें तो दे यूआरएल में देखने में सक्षम होने के लिए। डिफ़ॉल्ट ऐप पूल या एएसपी.NET 4.0 ऐप पूल का चयन करें।

  2. भौतिक पथ को इंगित करें कि आपकी .svc फ़ाइल आपके कंप्यूटर पर कहां है; मेरे लिए:

C:\Users\MyPC\Documents\DualCommunicationTest.Server\WcfServiceApp

  1. सक्षम प्रोटोकॉल के तहत सुनिश्चित पोर्ट 80 या किसी अन्य बंदरगाह पर HTTP होता है आप उदाहरण 8085 के लिए, है, लेकिन आप के लिए अपने रूटर पर इस बंदरगाह को आगे करने की आवश्यकता होगी सेवा मेजबान कंप्यूटर। यदि आपका सेवा होस्ट आपके LAN में आईपी 192.168.1.4 पर है, तो कंप्यूटर पर अपने राउटर अग्रेषित पोर्ट 80 (या जो भी पोर्ट आप उपयोग करते हैं-8085 कहें) पर कंप्यूटर 192.168.1.4 पर है।

और यह इतना आसान है।

+0

वास्तव में अच्छी पढ़ाई ... ठीक है, अगर मैं netTcp या wsDual के लिए जा रहा हूं, तो मैं अब और नहीं जानता, लेकिन, क्या आप कृपया इसे काम करने में मेरी मदद कर सकते हैं? मैं काम करने के लिए ऊपर दिए गए लिंक में लागू उदाहरण डालने में खुश हूं ... –

+0

@ तानेलियन बरैरीरा, मैंने अभी लेख को देखा है, ऐसा लगता है कि यह अच्छी तरह लिखा गया है, वास्तव में समस्या क्या है? यह इसे देखकर एक साधारण चैट सेवा को कार्यान्वित कर रहा है, डब्ल्यूसीएफ में कॉलबैक पर कई उदाहरण हैं। विचार का सारांश यह है कि क्लाइंट सेवा पर कुछ ऑपरेशन कहता है, और सेवा बदले में क्लाइंट पर एक विधि कॉल कर सकती है (यह कॉलबैक है), इसलिए क्लाइंट अस्थायी रूप से सर्वर की तरह ही होगा। 'ChatService' में विधियां ग्राहक हैं जो सर्वर पर कॉल करती हैं, और 'IChatServiceCallback' में विधियां क्लाइंट पर सेवा को आमंत्रित करती हैं। –

+0

@TanielianBarreira मेरे अपडेट को देखो। –

1

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

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

तो, टीसीपी का उपयोग करना बहुत आसान है। या तो ग्राहक या संभवतः ग्राहक एक उत्तर ऑब्जेक्ट का अनुरोध करता है जो सर्वर अंत से स्ट्रीम किया जाता है (प्रभाव में कभी खत्म होने वाला उत्तर नहीं), कि सर्वर नोटिफिकेशन को नीचे ला सकता है। हालांकि यह आसान नहीं है।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन मैं netTcp का उपयोग करने के लिए ऊपर दिए गए उदाहरण को कैसे बदल सकता हूं? –

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