Aracılığıyla paylaş


Net.TCP Bağlantı Noktası Paylaşımı Örneği

Bu makalede PortSharing örneği açıklanmaktadır.

TCP/IP protokolü, aynı makinede çalışan birden çok ağ uygulamasına yönelik bağlantıları ayırt etmek için bağlantı noktası olarak adlandırılan 16 bitlik bir sayı kullanır. Bir uygulama bir bağlantı noktasında dinliyorsa, bu bağlantı noktası için tüm TCP trafiği bu uygulamaya gider. Diğer uygulamalar bu bağlantı noktasını aynı anda dinleyemez.

Birçok protokolün kullandığı standart veya varsayılan bağlantı noktası numarası vardır. Örneğin, HTTP protokolü genellikle 80 numaralı TCP bağlantı noktasını kullanır. Internet Information Services'ın (IIS) birden çok HTTP uygulaması arasında bağlantı noktasını paylaşan bir dinleyicisi vardır. IIS, bağlantı noktasını doğrudan dinler ve ileti akışının içindeki bilgilere göre iletileri uygun uygulamaya iletir. Bu, birden çok HTTP uygulamasının iletileri almak üzere bağlantı noktasını ayırmak için rekabet etmek zorunda kalmadan aynı bağlantı noktası numarasını kullanmasına olanak tanır.

NetTcp Bağlantı Noktası Paylaşımı, benzer şekilde birden çok ağ uygulamasının tek bir bağlantı noktasını paylaşmasına izin veren bir Windows Communication Foundation (WCF) özelliğidir. NetTcp Bağlantı Noktası Paylaşım Hizmeti, net.tcp protokolunu kullanan bağlantıları kabul eder ve iletileri hedef adreslerine göre iletir.

NetTcp Bağlantı Noktası Paylaşım Hizmeti varsayılan olarak etkin değildir. Bu örneği çalıştırmadan önce hizmeti el ile etkinleştirmeniz gerekir. Daha fazla bilgi için bkz . Nasıl yapılır: Net.TCP Bağlantı Noktası Paylaşım Hizmetini Etkinleştirme. Hizmet devre dışı bırakılırsa, sunucu uygulaması başlatıldığında bir özel durum oluşur.

Unhandled Exception: System.ServiceModel.CommunicationException: The TransportManager failed to listen on the supplied URI using the NetTcpPortSharing service: failed to start the service because it is disabled. An administrator can enable it by running 'sc.exe config NetTcpPortSharing start= demand'.. ---> System.InvalidOperationException: Cannot start service NetTcpPortSharing on computer '.'. ---> System.ComponentModel.Win32Exception: The service cannot be started, either because it is disabled or because it has no enabled devices associated with it

Bağlantı noktası paylaşımı, bağlamanın veya TcpTransportBindingElement bağlama öğesinin PortSharingEnabledNetTcpBinding özelliği ayarlanarak sunucuda etkinleştirilir. İstemcinin bağlantı noktası paylaşımının sunucuda kullanmak üzere nasıl yapılandırıldığını bilmesi gerekmez.

Bağlantı Noktası Paylaşımını Etkinleştirme

Aşağıdaki kod, sunucuda bağlantı noktası paylaşımını etkinleştirmeyi gösterir. Rastgele bir URI yolu ile sabit bir bağlantı noktasında hizmetin bir örneğini ICalculator başlatır. İki hizmet aynı bağlantı noktasını paylaşabilse de NetTcp Bağlantı Noktası Paylaşım Hizmeti'nin iletileri doğru uygulamaya yönlendirebilmesi için genel uç nokta adreslerinin benzersiz olması gerekir.

// Configure a binding with TCP port sharing enabled
NetTcpBinding binding = new NetTcpBinding();
binding.PortSharingEnabled = true;

// Start a service on a fixed TCP port
ServiceHost host = new ServiceHost(typeof(CalculatorService));
ushort salt = (ushort)new Random().Next();
string address = $"net.tcp://localhost:9000/calculator/{salt}";
host.AddServiceEndpoint(typeof(ICalculator), binding, address);
host.Open();

Bağlantı noktası paylaşımı etkinleştirildiğinde, bağlantı noktası numarası üzerinde çakışma yaşamadan hizmeti birden çok kez çalıştırabilirsiniz. Bağlantı noktası paylaşımını devre dışı bırakmak için kodu değiştirirseniz, hizmetin iki kopyasını başlatmak ikincisinde ile AddressAlreadyInUseExceptionbaşarısız olur.

Unhandled Exception: System.ServiceModel.AddressAlreadyInUseException: There is already a listener on IP endpoint 0.0.0.0:9000. Make sure that you are not trying to use this endpoint multiple times in your application and that there are no other applications listening on this endpoint. ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted

Örneği Çalıştırma

İletilerin bağlantı noktasını paylaşan hizmetlere doğru şekilde yönlendirildiğini denetlemek için test istemcisini kullanabilirsiniz.

class client
{
   static void Main(string[] args)
   {
      Console.Write("Enter the service number to test: ");
      ushort salt = ushort.Parse(Console.ReadLine());
      string address = $"net.tcp://localhost:9000/calculator/{salt}";
      ChannelFactory<ICalculator> factory = new ChannelFactory<ICalculator>(new NetTcpBinding());
      ICalculator proxy = factory.CreateChannel(new EndpointAddress(address));

      // Call the Add service operation.
      double value1 = 100.00D;
      double value2 = 15.99D;
      double result = proxy.Add(value1, value2);
      Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

      // Call the Subtract service operation.
      value1 = 145.00D;
      value2 = 76.54D;
      result = proxy.Subtract(value1, value2);
      Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

      // Call the Multiply service operation.
      value1 = 9.00D;
      value2 = 81.25D;
      result = proxy.Multiply(value1, value2);
      Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

      // Call the Divide service operation.
      value1 = 22.00D;
      value2 = 7.00D;
      result = proxy.Divide(value1, value2);
      Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);

      Console.WriteLine();
      Console.WriteLine("Press <ENTER> to terminate client.");
      Console.ReadLine();

      factory.Close();
   }
}

Hizmetin her örneği benzersiz numarasını ve adresini yazdırır. Örneğin, service.exe çalıştırdığınızda aşağıdaki metni görebilirsiniz.

Service #4381 listening on net.tcp://localhost:9000/calculator/4381.
Press <ENTER> to terminate service.

client.exe çalıştırdığınızda burada gördüğünüz hizmet numarasını girin.

Enter the service number to test: 4381
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714

Press <ENTER> to terminate client.

Bu örnek, istemcinin kullandığı oluşturulan adres değiştirilerek makineler arası bir yapılandırmada çalıştırılabilir. Client.cs uç nokta adresi biçim dizesini hizmetinizin yeni adresiyle eşleşecek şekilde değiştirin. "localhost" başvurularını sunucu makinesinin IP adresiyle değiştirin. Bu değişikliği yaptıktan sonra örneği yeniden derlemeniz gerekir.

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Aşağıdaki komutu kullanarak ASP.NET 4.0'ı yükleyin.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  3. Giriş bölümünde daha önce açıklandığı gibi NetTcp Bağlantı Noktası Paylaşım Hizmeti'ni etkinleştirin.

  4. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

  5. Örneği tek veya makineler arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin. Bu örneği çalıştırmaya yönelik belirli ayrıntılar daha önce Örneği Çalıştırma bölümüne eklenmiştir.