WCF etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
WCF etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

8 Şubat 2018 Perşembe

ServiceContract Anotasyonu

Giriş
Interface sınıfının üstüne ServiceContract, metodların üstüne OperationContract yazılır. Bu sınıf tam olarak şu namespace içinde.
System.ServiceModel.ServiceContract
Service Arayüzü
Eğer metod sonuç dönüyorsa, sonuç nesnesinin XmlSerializable olması gerekir.
Service isimlerinin büyük I harfi ile başlaması iyi olur.
Örnek
Şöyle yaparız.
[ServiceContract]
public interface IService
{
  [OperationContract]
  int DoWork();
}
Örnek
Parametre alan metodlar için şöyle yaparız.
[ServiceContract]
public interface ICalculator
{
  [OperationContract]
  uint Divide(uint numerator, uint denominator);
}
Örnek
Şöyle yaparız.
[ServiceContract]
public interface ICalculator
{
  [OperationContract]
  Task<uint> DivideAsync(uint numerator, uint denominator);
}

Gerçekleştirim
Şöyle yaparız.
public class MyService : IService
{
  public void DoWork()
  {
  }
}
Aslına arayüz ve gerçekleştirimi birleştirmek mümkün ancak bu kötü bir kullanım yöntemi. Şöyle yapmamalıyız.
[ServiceContract]
public class MyService
{
  [OperationContract]
  void DoWork()
  {
  }
}
Service Nasıl Oluşturulur
1. "WCF Service Library"  proje tipi ile servisleri oluşturmak kolay. Hem Interface + Service Gerçekleştirimi + App.config üçlüsünü oluşturur.

2. "Add New Item > WCF Service" ile Interface + Service Gerçekleştirimini oluşturururz.

Callback Attribute
Şöyle yaparız.
[ServiceContract(CallbackContract = typeof(ICallbackService))]
public interface IMyService
{
  [OperationContract]
  void Hello();
}

[ServiceContract]
public interface ICallbackService
{
  [OperationContract]
  void CallClient();
}
Namespace Attribute
Şöyle yaparız.
[ServiceContract(Namespace="http://someservicecontract.org")]
public interface IService
{
    [OperationContract]
    void DoSomething(Department dept);
}
Üretilen XML şuna benzer. DoSomething metodu ServiceContract ile tanımlanan isim alanı içindedir.
<?xml version="1.0" encoding="UTF-8"?>
 <SOAP-ENV:Envelope xmlns:SOAP-ENV="..." xmlns:xsi="..." xmlns:xsd="...">
 <SOAP-ENV:Body>
   <DoSomething xmlns="http://someservicecontract.org/">
...
  </DoSomething>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Diğer Attribute'ler
Diğer ServiceContractAttribute özellikleri şöyle tanımlanabilir.
[ServiceContract(Namespace = "urn:x.ServiceContracts",  
Name = "xService", SessionMode = System.ServiceModel.SessionMode.Allowed,
 ProtectionLevel = ProtectionLevel.None)]
public partial interface IService
{...}

27 Ağustos 2017 Pazar

ServiceHost Sınıfı

Giriş
ServiceHost sınıfı IIS yoksa kullanılan bir sınıftır. Yani WCF sunucu tarafında kullanılır. ServiceHost kendi thread'ini kullanır. Dolayısıyla Open() metodu hemen döner.

Constructor
Şöyle yaparız.
var svh = new ServiceHost(typeof(MyService));
Constructor - Base Uri
Şöyle yaparız.
Uri address1 = new Uri("http://localhost/WFC_Server/");
Uri address2 = new Uri("net.pipe://localhost/WFC_Server/");
ServiceHost svh = new ServiceHost(typeof(MyService), address1,address2);
AddServiceEndPoint metodu
NetNamedPipe
Şöyle yaparız.
svh.AddServiceEndpoint(typeof(IMyService), 
                       new NetNamedPipeBinding(),  new Uri(hostUrl));
Url şöyle olabilir.
"net.pipe://localhost/WFC_Server/MyService.svc"
Eğer constructor içinde base uri verdiysek şöyle olabilir.
"MyService.svc"
MetaData
Eğer constructor içinde base uri verdiysek şöyle yaparız.
svh.AddServiceEndpoint(
  ServiceMetadataBehavior.MexContractName,
  MetadataExchangeBindings.CreateMexHttpBinding(),
  "mex"
);
Aynı şeyi XML ile şöyle yaparız. MetaData Endpoint tanımlanır.
<services>
  <service name="BillingService.BillingService">
    <endpoint address="mex" binding="mexHttpBinding" contract="..." />
    ...
</service>
MetaData Davranışı tanımlanır.
<serviceBehaviors>
  <behavior>
    <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
      ...
  </behavior>
</serviceBehaviors>
includeExceptionDetailInFaults
XML ile şöyle yaparız.
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Close metodu
Şöyle yaparız.
svh.Close();
Description Alanı
wsdl dosyasının sunulabilmesini sağlar. Şöyle yaparız.
//Create Metadata exchange for the service
ServiceMetadataBehavior mexBehavior = new ServiceMetadataBehavior();
mexBehavior.HttpGetEnabled = true;
svh.Description.Behaviors.Add(mexBehavior);
Şöyle yaparız.
ServiceMetadataBehavior mexBehavior = svh.Description.Behaviors
 .Find<ServiceMetadataBehavior>();
Open metodu
Şöyle yaparız.
svh.Open();
UnknownMessageReceived Event'i
Şöyle yaparız.
svh.UnknownMessageReceived += OnUnknownMessageReceived;
Event handler şöyledir.
void OnUnknownMessageReceived(object sender, UnknownMessageReceivedEventArgs e)
{
  LogFile.Instance().Append(e.Message.ToString());
}


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.