29 Kasım 2016 Salı

Windows Communication Foundation

Windows Communication Foundation (WCF) kullanması kolay bir iletişim altyapısını sunuyor

WCF ve Rest
WCF Rest için kısmi destek sağlar.
Although WCF provides some support for writing REST-style services, the support for REST in ASP.NET Web API is more complete and all future REST feature improvements will be made in ASP.NET Web API
ServiceContract
ServiceContract Anotasyonu yazısına taşıdım.

OperationContract
OperationContract ile de bir sürü OperationContractAttribute tanımlanabilir.
[OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, 
AsyncPattern = false, Action = "Insert", ProtectionLevel = ProtectionLevel.None)]
string[] Insert(string name);
Name tanımlanabilir.
[OperationContract(Name = "GetZipsByState")]
IEnumerable<ZipCodeData> GetZips(string state);

ServiceBehavior
Arayüzü gerçekleştiren sınıfın üstüne şöyle yazılır.
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
class HealthCheckService : IHealthCheckService, IDisposable
{
 
    public int GetDiskCFreeMb()
    {
        return 17389;
    }
}
EndPoint
Endpoint şu unsurlardan oluşur. Address, Binding ve ServiceContract. Address URL gibi düşünülebilir. Kullanılan transport tipine göre formatı/şekli değişiklik gösterir.

Xml'de genelde şöyle gösterilir. behaviorConfiguration tanımlamasını ben de anlamadım.
<endpoint address="" behaviorConfiguration="WebBehavior" binding="webHttpBinding"
 contract="ABService"/> 

Transport Tipleri
WCF'de temel 4 transport tipi var. Bunlar Http, TCP, Named Pipes ve MSMQ

1. Net Pipe Transport Tipi
Şöyle açılıyor
Uri uri = new Uri("net.pipe://localhost/service");
ServiceHost serviceHost = new ServiceHost(typeof(MyService), uri);

2. Http Binding Transport Tipi
3 yöntem var.

BasicHttpBinding
SOAP tarzı iletişim için kullanılır. Servisler WSDL ile tanımlanır. Bu servisler browser ile kullanılamaz. SOAP 1.1 ile uyumludur. Güvenlik sağlamaz. App.config içinde şöyle tanımlarız.
<basicHttpBinding>
  <binding name="BasicHttpBinding"  >
    <readerQuotas />
    <security mode="TransportCredentialOnly">

      <transport clientCredentialType="Basic" realm="" />
    </security>
  </binding>
</basicHttpBinding>
Aslında basicHttpBinding'in bir sürü parametresi daha var. Nihayetinde XML içine binding ve endpoint birleştirilerek bir client oluşturulur.
<bindings>
  <basicHttpBinding>
    <binding name="MyBinding" ...>
      ...
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="..." binding="basicHttpBinding"
            bindingConfiguration="MyBinding" .../>
</client>
XML ayarlarını kodlamak istersek şu sınıfı kullanırız.
System.ServiceModel.Channels.Binding
 binding = new System.ServiceModel.BasicHttpBinding();
Daha sonra binding ve endpoint ile bir client oluştururuz.
System.ServiceModel.BasicHttpBinding binding = ...;
System.ServiceModel.EndpointAddress address = ...;
...
Client = new ImageServerClient (binding, address);

WsHttpBinding
SOAP tarzı iletişim için kullanılır. Servisler WSDL ile tanımlanır. Bu servisler browser ile kullanılamaz. Bir sürü WS-* özelliğini destekler.

Http için örnek bir binding şöyle
Wshttpbinding with Security=Message and Authentication as Windows.

Https için örnek bir binding şöyle
Wshttpbinding with Security=Transport and Authentication as Certificates.

Basit bir konsol uygulaması şöyle yazılır. ServiceHost sınıfı IIS yoksa kullanılan bir sınıftır. ServiceHost kendi thread'ini kullanır. Dolayısıyla Open() metodu hemen döner.

Uri uri = new Uri("http://localhost:8000/GettingStarted/");
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), uri);

selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), 
                            "CalculatorService");

ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;              
selfHost.Description.Behaviors.Add(smb);

selfHost.Open();
Console.ReadLine();

selfHost.Close();
Eğer aynı şeyi kodla değil de App.config ile yapmak isteseydik şuna benzer satırlar eklemek gerekirdi.
<system.serviceModel>
  <bindings>
    <wsHttpBinding>
    ...
    </wsHttpBinding>
  </bindings>
    ...
</system.serviceModel>
WebHttpBinding
REST tarzı iletişim için kullanılır.

WCF Hosting

WCF 3 tip uygulama içinde kullanılabilir.
1. IIS - Hiç kullanmadım
2. Managed Application  - Yukarıda örneği verilen ServiceHost sınıfı ile gerçekleştirilir.
3. Windows Service - Hiç kullanmadım

Çağıran Taraf - Client Code
ChannelFactory Sınıfı yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder