Nasıl yapılır: WAS'ta WCF Hizmeti Barındırma
Bu konu başlığı altında, barındırılan bir Windows Communication Foundation (WCF) hizmeti oluşturmak için gereken temel adımlar özetlenmektedir. WAS, HTTP dışı aktarım protokolleriyle çalışan Internet Information Services (IIS) özelliklerinin genelleştirilmesi olan yeni işlem etkinleştirme hizmetidir. WCF, TCP, adlandırılmış kanallar ve Message Queuing gibi WCF tarafından desteklenen HTTP dışı protokoller üzerinden alınan etkinleştirme isteklerini iletmek için dinleyici bağdaştırıcısı arabirimini kullanır.
Bu barındırma seçeneği WAS etkinleştirme bileşenlerinin düzgün şekilde yüklenmesini ve yapılandırılmasını gerektirir, ancak uygulamanın bir parçası olarak herhangi bir barındırma kodunun yazılması gerekmez. WAS'yi yükleme ve yapılandırma hakkında daha fazla bilgi için bkz . Nasıl yapılır: WCF Etkinleştirme Bileşenlerini Yükleme ve Yapılandırma.
Uyarı
Web sunucusunun istek işleme işlem hattı Klasik moda ayarlandıysa WAS etkinleştirmesi desteklenmez. WAS etkinleştirmesi kullanılacaksa web sunucusunun istek işleme işlem hattı Tümleşik moda ayarlanmalıdır.
BIR WCF hizmeti WAS'de barındırıldığında standart bağlamalar her zamanki gibi kullanılır. Ancak, was tarafından barındırılan NetTcpBindingNetNamedPipeBinding bir hizmeti yapılandırmak için ve kullanılırken bir kısıtlamanın karşılanması gerekir. Farklı uç noktalar aynı taşımayı kullandığında, bağlama ayarlarının aşağıdaki yedi özellikte eşleşmesi gerekir:
Bağlan ionBufferSize
ChannelInitializationTimeout
MaxPending Bağlan ions
MaxOutputDelay
MaxPendingAccepts
Bağlan ionPool Ayarlar. Idletimeout
Bağlan ionPool Ayarlar. MaxOutbound Bağlan ionsPerEndpoint
Aksi takdirde, ilk olarak başlatılan uç nokta her zaman bu özelliklerin değerlerini belirler ve daha sonra eklenen uç noktalar bu ayarlarla eşleşmezse bir ServiceActivationException oluşturur.
Bu örneğin kaynak kopyası için bkz . TCP Etkinleştirme.
WAS tarafından barındırılan temel bir hizmet oluşturmak için
Hizmet türü için bir hizmet sözleşmesi tanımlayın.
[ServiceContract] public interface ICalculator { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); }
Hizmet sözleşmesini bir hizmet sınıfında uygulayın. Adres veya bağlama bilgilerinin hizmetin uygulamasında belirtilmediğini unutmayın. Ayrıca, yapılandırma dosyasından bu bilgileri almak için kodun yazılması gerekmez.
public class CalculatorService : ICalculator { public double Add(double n1, double n2) { return n1 + n2; } public double Subtract(double n1, double n2) { return n1 - n2; } public double Multiply(double n1, double n2) { return n1 * n2; } public double Divide(double n1, double n2) { return n1 / n2; } }
Uç noktalar tarafından
CalculatorService
kullanılacak bağlamayı NetTcpBinding tanımlamak için bir Web.config dosyası oluşturun.<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <bindings> <netTcpBinding> <binding portSharingEnabled="true"> <security mode="None" /> </binding> </netTcpBinding> </bindings> </system.serviceModel> </configuration>
Aşağıdaki kodu içeren bir Service.svc dosyası oluşturun.
<%@ServiceHost language=c# Service="CalculatorService" %>
Service.svc dosyasını IIS sanal dizininize yerleştirin.
Hizmeti kullanmak üzere bir istemci oluşturmak için
Hizmet meta verilerinden kod oluşturmak için komut satırından ServiceModel Meta Veri Yardımcı Programı Aracı'nı (Svcutil.exe) kullanın.
Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
Oluşturulan istemci, istemci uygulamasının karşılaması
ICalculator
gereken hizmet sözleşmesini tanımlayan arabirimi içerir.//Generated interface defining the ICalculator contract [System.ServiceModel.ServiceContractAttribute( Namespace="http://Microsoft.ServiceModel.Samples", ConfigurationName="Microsoft.ServiceModel.Samples.ICalculator")] public interface ICalculator { [System.ServiceModel.OperationContractAttribute( Action="http://Microsoft.ServiceModel.Samples/ICalculator/Add", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")] double Add(double n1, double n2); [System.ServiceModel.OperationContractAttribute( Action="http://Microsoft.ServiceModel.Samples/ICalculator/Subtract", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")] double Subtract(double n1, double n2); [System.ServiceModel.OperationContractAttribute( Action="http://Microsoft.ServiceModel.Samples/ICalculator/Multiply", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")] double Multiply(double n1, double n2); [System.ServiceModel.OperationContractAttribute( Action="http://Microsoft.ServiceModel.Samples/ICalculator/Divide", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")] double Divide(double n1, double n2); }
Oluşturulan istemci uygulaması da uygulamasını
ClientCalculator
içerir. Adres ve bağlama bilgilerinin hizmetin uygulanması içinde herhangi bir yerde belirtilmediğini unutmayın. Ayrıca, yapılandırma dosyasından bu bilgileri almak için kodun yazılması gerekmez.// Implementation of the CalculatorClient public partial class CalculatorClient : System.ServiceModel.ClientBase<Microsoft.ServiceModel.Samples.ICalculator>, Microsoft.ServiceModel.Samples.ICalculator { public CalculatorClient() { } public CalculatorClient(string endpointConfigurationName) : base(endpointConfigurationName) { } public CalculatorClient(string endpointConfigurationName, string remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public CalculatorClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public CalculatorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : base(binding, remoteAddress) { } public double Add(double n1, double n2) { return base.Channel.Add(n1, n2); } public double Subtract(double n1, double n2) { return base.Channel.Subtract(n1, n2); } public double Multiply(double n1, double n2) { return base.Channel.Multiply(n1, n2); } public double Divide(double n1, double n2) { return base.Channel.Divide(n1, n2); } }
kullanan istemcinin NetTcpBinding yapılandırması da Svcutil.exe tarafından oluşturulur. Visual Studio kullanılırken bu dosya App.config dosyasında adlandırılmalıdır.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <bindings> <netTcpBinding> <binding name="NetTcpBinding_ICalculator"> <security mode="None"/> </binding> </netTcpBinding> </bindings> <client> <endpoint address="net.tcp://localhost/servicemodelsamples/service.svc" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ICalculator" contract="ICalculator" name="NetTcpBinding_ICalculator" /> </client> </system.serviceModel> </configuration>
Bir uygulamada öğesinin
ClientCalculator
bir örneğini oluşturun ve ardından hizmet işlemlerini çağırın.//Client implementation code. class Client { static void Main() { // Create a client with given client endpoint configuration CalculatorClient client = new CalculatorClient(); // Call the Add service operation. double value1 = 100.00D; double value2 = 15.99D; double result = client.Add(value1, value2); Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); // Call the Subtract service operation. value1 = 145.00D; value2 = 76.54D; result = client.Subtract(value1, value2); Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result); // Call the Multiply service operation. value1 = 9.00D; value2 = 81.25D; result = client.Multiply(value1, value2); Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result); // Call the Divide service operation. value1 = 22.00D; value2 = 7.00D; result = client.Divide(value1, value2); Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result); //Closing the client gracefully closes the connection and cleans up resources client.Close(); Console.WriteLine(); Console.WriteLine("Press <ENTER> to terminate client."); Console.ReadLine(); } }
İstemciyi derleyin ve çalıştırın.