WCF ने पाइप का नाम न्यूनतम उदाहरण रखा


90

मैं WCF नामांकित पाइप्स के न्यूनतम उदाहरण की तलाश कर रहा हूं (मुझे दो न्यूनतम अनुप्रयोगों, सर्वर और क्लाइंट की उम्मीद है, जो एक नामित पाइप के माध्यम से संचार कर सकते हैं।)

Microsoft के पास ब्रिलिएंट आर्टिकल Get Started Tutorial है जो HTTP के माध्यम से WCF का वर्णन करता है, और मैं WCF और नामित पाइप के बारे में कुछ इसी तरह की तलाश कर रहा हूं।

मैंने इंटरनेट में कई पोस्ट पाए हैं, लेकिन वे थोड़ा "उन्नत" हैं। मुझे कुछ न्यूनतम, केवल अनिवार्य कार्यक्षमता की आवश्यकता है, इसलिए मैं अपना कोड जोड़ सकता हूं और काम कर सकता हूं।

मैं एक नामित पाइप का उपयोग करने के लिए उसे कैसे प्रतिस्थापित करूं?

<endpoint address="http://localhost:8000/ServiceModelSamples/Service/CalculatorService"
    binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator"
    contract="ICalculator" name="WSHttpBinding_ICalculator">
    <identity>
        <userPrincipalName value="OlegPc\Oleg" />
    </identity>
</endpoint>

मैं एक नामित पाइप का उपयोग करने के लिए उसे कैसे प्रतिस्थापित करूं?

// Step 1 of the address configuration procedure: Create a URI to serve as the base address.
Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/Service");

// Step 2 of the hosting procedure: Create ServiceHost
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);

try
{
    // Step 3 of the hosting procedure: Add a service endpoint.
    selfHost.AddServiceEndpoint(
        typeof(ICalculator),
        new WSHttpBinding(),
        "CalculatorService");

    // Step 4 of the hosting procedure: Enable metadata exchange.
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    selfHost.Description.Behaviors.Add(smb);

    // Step 5 of the hosting procedure: Start (and then stop) the service.
    selfHost.Open();
    Console.WriteLine("The service is ready.");
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.WriteLine();
    Console.ReadLine();

    // Close the ServiceHostBase to shutdown the service.
    selfHost.Close();
}
catch (CommunicationException ce)
{
    Console.WriteLine("An exception occurred: {0}", ce.Message);
    selfHost.Abort();
}

मैं एक नामित पाइप का उपयोग करने के लिए क्लाइंट कैसे उत्पन्न करूं?


1
क्या आपने stackoverflow.com/questions/184878/… को देखा है ?
क्रिस्टोफ़

जवाबों:


80

मुझे यह उत्कृष्ट छोटा ट्यूटोरियल मिला । टूटी लिंक ( कैश्ड संस्करण )

मैंने Microsoft के ट्यूटोरियल का भी अनुसरण किया जो अच्छा है, लेकिन मुझे केवल पाइप की ही आवश्यकता थी।

जैसा कि आप देख सकते हैं, आपको कॉन्फ़िगरेशन फ़ाइलों और सभी गड़बड़ सामान की आवश्यकता नहीं है।

वैसे, वह HTTP और पाइप दोनों का उपयोग करता है। बस HTTP से संबंधित सभी कोड लाइनों को हटा दें, और आपको एक शुद्ध पाइप उदाहरण मिलेगा।


2
धन्यवाद! इसके अलावा, जब हार्डकॉन्ड
Nullius

3
लिंक काम नहीं करता है, ट्यूटोरियल कहीं और है?
user1069816

बस यह पता लगाने की कोशिश में कुछ समय बिताया कि "पाइप को समाप्त क्यों किया गया है"। यहाँ उस पर मेरा हल है, उम्मीद है कि मदद करता है: stackoverflow.com/a/49075797/385273
बेन

62

इसे इस्तेमाल करे।

यहां सर्विस पार्ट है।

[ServiceContract]
public interface IService
{
    [OperationContract]
    void  HelloWorld();
}

public class Service : IService
{
    public void HelloWorld()
    {
        //Hello World
    }
}

यहाँ प्रॉक्सी है

public class ServiceProxy : ClientBase<IService>
{
    public ServiceProxy()
        : base(new ServiceEndpoint(ContractDescription.GetContract(typeof(IService)),
            new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/MyAppNameThatNobodyElseWillUse/helloservice")))
    {

    }
    public void InvokeHelloWorld()
    {
        Channel.HelloWorld();
    }
}

और यहाँ सर्विस होस्टिंग पार्ट है।

var serviceHost = new ServiceHost
        (typeof(Service), new Uri[] { new Uri("net.pipe://localhost/MyAppNameThatNobodyElseWillUse") });
    serviceHost.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "helloservice");
    serviceHost.Open();

    Console.WriteLine("Service started. Available in following endpoints");
    foreach (var serviceEndpoint in serviceHost.Description.Endpoints)
    {
        Console.WriteLine(serviceEndpoint.ListenUri.AbsoluteUri);
    }

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

9
अच्छा है, क्योंकि app.config फ़ाइलों के माध्यम से आवेदन विवरण उजागर अक्सर वांछित नहीं है।
फ्रैंक हिलमैन

14
यह एक अद्भुत उदाहरण है, हालांकि, कभी भी net.pipe: // localhost / के आधार पते का उपयोग न करें। यदि आप करते हैं और मशीन में कोई अन्य प्रोग्राम है जो net.pipe: // localhost / का उपयोग करता है, तो सर्विसहॉस्ट इसे खोलने पर अपवाद छोड़ देगा। इसके बजाय, net.pipe: // localhost / MyAppNameThatNobodyElseWillUse जैसे कुछ अद्वितीय का उपयोग करें। आशा है कि यह किसी और को कुछ समय और हताशा को बचाने में मदद करता है!
डग क्लटर

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

2
मुझे /helloserviceप्रॉक्सी में एंडपॉइंट पते के अंत में जोड़ने की आवश्यकता थी ।
मोर्मगिल

14

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

संपादित करें सर्वर के app.config फ़ाइल निकाल देते हैं या http बाहर टिप्पणी baseAddress प्रविष्टि और एक नया जोड़ने baseAddress नामित पाइप (बुलाया के लिए प्रवेश net.pipe )। इसके अलावा, अगर आप एक संचार प्रोटोकॉल के लिए HTTP का उपयोग करने पर इरादा नहीं है, यह सुनिश्चित कर लें serviceMetadata और serviceDebug या तो बाहर टिप्पणी की या नष्ट कर दिया जाता है:

<configuration>
    <system.serviceModel>
        <services>
            <service name="com.aschneider.examples.wcf.services.EchoService">
                <host>
                    <baseAddresses>
                        <add baseAddress="net.pipe://localhost/EchoService"/>
                    </baseAddresses>
                </host>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors></serviceBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

संपादित करें ग्राहक की app.config फ़ाइल ताकि basicHttpBinding या तो बाहर टिप्पणी की या नष्ट कर दिया है और एक है netNamedPipeBinding प्रविष्टि जोड़ा जाता है। आपको पाइप का उपयोग करने के लिए समापन बिंदु प्रविष्टि बदलने की भी आवश्यकता होगी :

<configuration>
    <system.serviceModel>
        <bindings>
            <netNamedPipeBinding>
                <binding name="NetNamedPipeBinding_IEchoService"/>
            </netNamedPipeBinding>
        </bindings>
        <client>
            <endpoint address              = "net.pipe://localhost/EchoService"
                      binding              = "netNamedPipeBinding"
                      bindingConfiguration = "NetNamedPipeBinding_IEchoService"
                      contract             = "EchoServiceReference.IEchoService"
                      name                 = "NetNamedPipeBinding_IEchoService"/>
        </client>
    </system.serviceModel>
</configuration>

उपरोक्त उदाहरण केवल नामित पाइपों के साथ चलेगा, लेकिन आपकी सेवा को चलाने के लिए कई प्रोटोकॉल का उपयोग करने से कुछ भी नहीं रोक रहा है। AFAIK, आपको सर्वर नाम पाइप और HTTP (साथ ही अन्य प्रोटोकॉल) का उपयोग करके सेवा चलाने में सक्षम होना चाहिए।

इसके अलावा, क्लाइंट के ऐप.कॉन्फिग फ़ाइल में बाइंडिंग अत्यधिक सरलीकृत है। वहाँ कई विभिन्न मापदंडों तुम सिर्फ निर्दिष्ट करने के अलावा, समायोजित कर सकते हैं कर रहे हैं baseAddress ...


5
लिंक अब मर चुके हैं।
क्रिस वेबर

2

मैंने इंटरनेट पर विभिन्न खोज परिणामों से यह सरल उदाहरण बनाया।

public static ServiceHost CreateServiceHost(Type serviceInterface, Type implementation)
{
  //Create base address
  string baseAddress = "net.pipe://localhost/MyService";

  ServiceHost serviceHost = new ServiceHost(implementation, new Uri(baseAddress));

  //Net named pipe
  NetNamedPipeBinding binding = new NetNamedPipeBinding { MaxReceivedMessageSize = 2147483647 };
  serviceHost.AddServiceEndpoint(serviceInterface, binding, baseAddress);

  //MEX - Meta data exchange
  ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
  serviceHost.Description.Behaviors.Add(behavior);
  serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexNamedPipeBinding(), baseAddress + "/mex/");

  return serviceHost;
}

उपरोक्त यूआरआई का उपयोग करके मैं अपने ग्राहक को वेब सेवा में एक संदर्भ जोड़ सकता हूं।


-2

मुझे यह साइट वास्तव में मददगार लगी, और उदाहरण परियोजना बिना किसी ट्वीकिंग के चलती है: https://dotnet-experience.blogspot.com/2012/02/inter-process-duplex-communication-with.html

Windows सुविधाओं में नामांकित पाइप समर्थन को सक्षम करने के लिए मत भूलना। इस लेख के शीर्ष उत्तर में इस आशय के कुछ अच्छे स्क्रीनशॉट हैं: App.Config का उपयोग करके Windows सेवा में WCF नामांकित पाइप

स्वीकृत समाधान में संदर्भित परियोजना मेरे पीसी पर नहीं है। मैंने app.config में कुछ सुधार की कोशिश की, लेकिन फिर भी निम्नलिखित अपवाद प्राप्त करें:

System.InvalidOperationException: 'Service' WpfWcfNamedPipeBinding.NamedPipeBindingService 'में शून्य एप्लिकेशन (गैर-अवसंरचना) अंतबिंदु है। यह इसलिए हो सकता है कि आपके एप्लिकेशन के लिए कोई कॉन्फ़िगरेशन फ़ाइल नहीं मिली, या क्योंकि सेवा नाम से मेल खाने वाला कोई सेवा तत्व कॉन्फ़िगरेशन फ़ाइल में नहीं मिल सकता है, या इसलिए कि कोई अंतिम बिंदु सेवा तत्व में परिभाषित नहीं किए गए थे। '

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.