WCF পাইপ ন্যূনতম উদাহরণ


90

আমি ডাব্লুসিএফ নামযুক্ত পাইপগুলির ন্যূনতম উদাহরণের সন্ধান করছি (আমি দুটি ন্যূনতম অ্যাপ্লিকেশন, সার্ভার এবং ক্লায়েন্ট আশা করি, যা একটি নামযুক্ত পাইপের মাধ্যমে যোগাযোগ করতে পারে))

মাইক্রোসফ্টের উজ্জ্বল নিবন্ধটি শুরু করা টিউটোরিয়াল রয়েছে যা এইচটিটিপি-র মাধ্যমে ডাব্লুসিএফ-কে বর্ণনা করে এবং আমি ডাব্লুসিএফ এবং নামযুক্ত পাইপগুলির অনুরূপ কিছু সন্ধান করছি।

আমি ইন্টারনেটে বেশ কয়েকটি পোস্ট পেয়েছি তবে সেগুলি কিছুটা "উন্নত"। আমার ন্যূনতম কিছু প্রয়োজন, কেবলমাত্র বাধ্যতামূলক কার্যকারিতা, তাই আমি আমার কোড যুক্ত করতে এবং অ্যাপ্লিকেশনটি কাজ করতে পারি।

একটি নামী পাইপ ব্যবহার করতে আমি কীভাবে এটি প্রতিস্থাপন করব?

<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();
}

নামী পাইপ ব্যবহার করার জন্য আমি কীভাবে ক্লায়েন্ট তৈরি করতে পারি?


উত্তর:


80

আমি এই দুর্দান্ত ছোট টিউটোরিয়ালটি সবেমাত্র পেয়েছি । ভাঙা লিঙ্ক ( ক্যাশেড সংস্করণ )

আমি মাইক্রোসফ্টের টিউটোরিয়ালটিও অনুসরণ করেছি যা দুর্দান্ত, তবে আমার কেবল পাইপগুলিরও দরকার ছিল।

যেমন আপনি দেখতে পাচ্ছেন, আপনার কনফিগারেশন ফাইল এবং সমস্ত অগোছালো স্টাফের দরকার নেই।

যাইহোক, তিনি এইচটিটিপি এবং পাইপ উভয়ই ব্যবহার করেন। কেবল এইচটিটিপি সম্পর্কিত সমস্ত কোড লাইন সরান, এবং আপনি একটি খাঁটি পাইপের উদাহরণ পাবেন।


4
ধন্যবাদ! এছাড়াও, হার্ডকডযুক্ত কনফিগারেশনের পরিবর্তে কনফিগারেশনের জন্য ওয়েবকনফিগ ব্যবহার করে এমন একটি পরিষেবা তৈরির চেষ্টা করার সময়, এই মাইক্রোসফ্ট উদাহরণটি দেখুন: এমএসডিএন.মাইক্রোসফটকম /en-us/library/ms752253.aspx
নুলিয়াস

4
লিঙ্কটি কাজ করে না, টিউটোরিয়ালটি অন্য কোথাও আছে কি?
ব্যবহারকারী 1069816

"পাইপটি কেন শেষ হয়েছে" তা জানার চেষ্টা করতে কিছুক্ষণ ব্যয় করলেন। এখানে সেটার জন্য আমার সমাধানটি এখানে আশাবাদী
বেন

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
দুর্দান্ত, যেহেতু অ্যাপ.config ফাইলগুলির মাধ্যমে আবেদনের বিশদটি প্রকাশ করা প্রায়শই কাঙ্ক্ষিত নয়।
ফ্রাঙ্ক হিলেমান

14
এটি দুর্দান্ত উদাহরণ, তবে কখনই কেবল নেট.পাইপ: // লোকালহোস্ট / এর একটি বেস ঠিকানা ব্যবহার করবেন না। যদি আপনি এটি করেন এবং মেশিনে অন্য কোনও প্রোগ্রাম রয়েছে যা নেট.পাইপ: // লোকালহোস্ট / ব্যবহার করে তবে সার্ভিস হস্ট এটি খুললে একটি ব্যতিক্রম ছুঁড়ে দেবে। পরিবর্তে, নেট.পাইপ: // লোকালহোস্ট / মাইএপনেমেট্যাট নোবডিএলস উইল ইউসের মতো অনন্য কিছু ব্যবহার করুন। আশা করি এটি অন্য কাউকে কিছুটা সময় এবং হতাশা বাঁচাতে সহায়তা করবে!
ডগ ক্লটার

এই সমাধানটি ভাল কাজ করে। বিশেষত অভ্যন্তরীণ সমাপ্তির জন্য যেখানে কনফিগারেশনে কোনও পরিষেবার রেফারেন্স থাকা প্রয়োজন হয় না। কেবল চুক্তিগুলি রাখুন - কেবলমাত্র ইন্টারফেস সংজ্ঞা - তাদের নিজস্ব সমাবেশে এবং সম্ভবত ঠিকানাটিতে ঠিকানা। এটি এতটা সম্ভবত না যে বাধ্যতামূলক পরিবর্তন হবে।
রব ভন নেসেলরোড

4
/helloserviceপ্রক্সিটিতে আমার শেষ পয়েন্টের শেষে যুক্ত করা দরকার ।
মুরমেগিল

14

আমার অত্যন্ত সরল ইকো উদাহরণটি দেখুন : এটি বেসিক HTTP যোগাযোগ ব্যবহারের জন্য ডিজাইন করা হয়েছে তবে ক্লায়েন্ট এবং সার্ভারের জন্য অ্যাপকনফাইগ ফাইলগুলি সম্পাদনা করে নামযুক্ত পাইপগুলি ব্যবহার করতে সহজেই এটি পরিবর্তন করা যেতে পারে । নিম্নলিখিত পরিবর্তনগুলি করুন:

সার্ভারের app.config ফাইলটি সম্পাদনা করুন, http বেসএড্রেস এন্ট্রি সরিয়ে বা মন্তব্য করে এবং নামক পাইপের (যা নেট.পাইপ নামে পরিচিত ) জন্য একটি নতুন বেসএড্রেস এন্ট্রি যুক্ত করুন । এছাড়াও, যদি আপনি কোনও যোগাযোগ প্রোটোকলের জন্য এইচটিটিপি ব্যবহারের উদ্দেশ্যে না করেন তবে নিশ্চিত হয়ে নিন যে সার্ভিস মেটাডেটা এবং সার্ভিস ডেগুগ মন্তব্য করেছে বা মুছে ফেলা হয়েছে:

<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>

ক্লায়েন্টের অ্যাপকনফাইগ ফাইলটি সম্পাদনা করুন যাতে বেসিক এইচটিপবাইন্ডিং হয় হয় মন্তব্য করে বা মুছে ফেলা হয় এবং একটি নেটনামপাইপবাইন্ডিং এন্ট্রি যুক্ত করা হয়। পাইপটি ব্যবহার করার জন্য আপনাকে শেষের দিকের এন্ট্রি পরিবর্তন করতে হবে:

<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>

উপরের উদাহরণটি কেবল নামযুক্ত পাইপগুলি দিয়ে চলবে, তবে কোনও কিছুই আপনাকে আপনার পরিষেবা চালনার জন্য একাধিক প্রোটোকল ব্যবহার করা থেকে বিরত করছে না। আফাইক, আপনার নামী পাইপ এবং এইচটিটিপি (পাশাপাশি অন্যান্য প্রোটোকল) উভয় ব্যবহার করে কোনও সার্ভার চালানো একটি সার্ভারের পক্ষে হওয়া উচিত।

এছাড়াও, ক্লায়েন্টের app.config ফাইলের বাইন্ডিং অত্যন্ত সরল ified কেবলমাত্র বেসএড্রেস নির্দিষ্ট করে বাদ দিয়ে আপনি অনেকগুলি পৃথক প্যারামিটার সমন্বিত করতে পারেন ...


4
লিঙ্কগুলি এখন মারা গেছে।
ক্রিস ওয়েবার

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

উইন্ডোজ বৈশিষ্ট্যগুলিতে নামযুক্ত পাইপ সমর্থন সক্ষম করতে ভুলবেন না। এই নিবন্ধটির শীর্ষ উত্তরে সেই প্রভাবটির জন্য কিছু ভাল স্ক্রিনশট রয়েছে: অ্যাপ্লিকেশন.কনফিগ ব্যবহার করে উইন্ডোজ পরিষেবাতে ডাব্লুসিএফ নামযুক্ত পাইপ

গৃহীত সমাধানে উল্লেখ করা প্রকল্পটি আমার পিসিতে চলবে না। আমি অ্যাপ্লিকেশন কনফিগটিতে কয়েকটি সংশোধন করার চেষ্টা করেছি তবে এখনও নিম্নলিখিত ব্যতিক্রমগুলি পেয়েছি:

System.InuthorOperationException: 'পরিষেবাদি' WpfWcfNamedPipeBinding.NamePipeBinding Services 'এর শূন্য অ্যাপ্লিকেশন (অ-অবকাঠামো) এন্ডপয়েন্ট রয়েছে। এটি হতে পারে কারণ আপনার অ্যাপ্লিকেশনের জন্য কোনও কনফিগারেশন ফাইল পাওয়া যায় নি, বা সার্ভিসের নামের সাথে কোনও পরিষেবার উপাদান মেলে এমন কোনও উপাদান উপাদান কনফিগারেশন ফাইলে খুঁজে পাওয়া যায়নি, বা কোনও পরিষেবা বিন্দুতে কোনও অন্তিম বিন্দু সংজ্ঞায়িত হয়নি। '

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.