Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

24 Nisan 2015 Cuma

nodemon.json vs npm run


Nodemon ayarlarını isterseniz bir config dosyasında tutabilirsiniz.
nodemon.json
{
  "verbose": true,
  "ignore": [
    "e2e-tests/*",
    "node_modules/*"
  ],
  "watch": ["node/routes/*.js"],
  "script": "node/bin/www"
}

ya da package.json içinde scripts içinde özel bir anahtarda tutabilirsiniz:
package.json
{
  "name": "angular-seed",
  "private": true,
  "version": "0.0.0",
  "description": "A starter project for AngularJS",
  "repository": "https://github.com/angular/angular-seed",
  "license": "MIT",
  "devDependencies": {
    "bower": "^1.3.1",
    "debug": "~2.0.0",
    "http-server": "^0.6.1",
    "karma": "~0.10",
    "karma-junit-reporter": "^0.2.2",
    "matchdep": "^0.3.0",
    "mocha": "^2.2.4",
    "protractor": "^1.1.1",
    "shelljs": "^0.2.6"
  },
  "dependencies": {
    "acl": "^0.4.7",
    "activedirectory": "^0.6.3",
    "body-parser": "~1.8.1",
    "cheerio": "^0.19.0",
    "compression": "1.1.1",
    "connect-busboy": "0.0.2",
    "connect-redis": "^2.2.0",
    "consolidate": "^0.12.1",
    "cookie-parser": "~1.3.3",
    "ejs": "^2.3.1",
    "emailjs": "^0.3.13",
    "express": "~4.9.0",
    "express-session": "1.8.2",
    "iconv-lite": "0.4.6",
    "jade": "~1.6.0",
    "jquery": "^1.8.3",
    "jsdom": "^4.1.0",
    "moment": "2.8.3",
    "morgan": "~1.3.0",
    "node-xlsx": "^0.5.1",
    "path": "0.4.9",
    "q": "1.0.1",
    "redis": "0.12.1",
    "request": "2.44.0",
    "serve-favicon": "~2.1.3",
    "socket.io": "^1.3.4",
    "underscore": "1.7.0",
    "winston": "^0.9.0",
    "winston-redis": "^0.3.0"
  },
  "scripts": {
    "start": "node ./node/www",
    "debug": "nodemon node/www -V -w './node/routes/**/*.js' -i './e2e-tests/*' -i './node_modules/*'",
    "test": "./node_modules/.bin/mocha"
  }
}

Normalde test, start gibi tanımlarınızı npm test, npm start ile çalıştırabilirken özel tanımladıklarınızı (burada debug oluyor) npm run debug ile çalıştırabilirsiniz.
Konsolde eğer nodemon'u doğrudan çalıştırırsanız nodemon.json dosyasının içindekini okuyarak çalıştırmış olacağınızı hatırlatmaya gerek yok:
C:\_Projeler\AdminLTE\trunk>nodemon
24 Apr 15:32:03 - [nodemon] v1.3.6
24 Apr 15:32:03 - [nodemon] reading config C:\_Projeler\AdminLTE\trunk\nodemon.json
24 Apr 15:32:03 - [nodemon] to restart at any time, enter `rs`
24 Apr 15:32:03 - [nodemon] ignoring: e2e-tests/**/* node_modules/**/*
24 Apr 15:32:03 - [nodemon] watching: node/routes/*.js
24 Apr 15:32:03 - [nodemon] watching extensions: js
24 Apr 15:32:03 - [nodemon] starting `node index.js`
24 Apr 15:32:03 - [nodemon] child pid: 13100
24 Apr 15:32:03 - [nodemon] watching 0 files

22 Nisan 2015 Çarşamba

Node.js'de namespace yapısı oluşturma

Modül yapısında
index.js başlangıç noktamız ve içerisine 1 ve 3 numaralı dosyaları require ile alması için gereken kodu yazıyoruz. Biliyoruzki 1 ve 3 gelecek ama 1'in içinde 2 numaralı dosyamızı çektiğimizde gelecek mi ve akış sırası nasıl olacak ona bakacağız.
var db1 = require('./db1'),
    db3 = require('./db3');

console.log("index içinde");
module.exports = {index:'index', db1:db1, db3:db3};

db1.js dosyamız içinden db2 yi çekelim:
var db2 = require('./db2');
console.log("db1 içinde");
module.exports = {db:1,db2:db2};

ve db2 içinde sadece ekrana yazdıralım burada olduğunu
console.log("db2 içinde");
module.exports = {db:2};

db3 ise db2 ile aynı işi yapsın
console.log("db3 içinde");
module.exports = {db:3};

çıktımız:
C:\Users\cem.topkaya\WebstormProjects\angTest\server>node
> var i = require('./db')
db2 içinde
db1 içinde
db3 içinde
index içinde
undefined
> i
{ index: 'index',
  db1: { db: 1, db2: { db: 2 } },
  db3: { db: 3 } }
>
Akışa bakalım. Önce index.js içinde ama ilk satır require(./db1) o yüzden db1.js içine gidiyor. Orada ilk satır require(./db2) olduğu için db2.js e gidiyor ve console.log ile "db2 içinde" yazıyor ve db1.js den devam ediyor "db1 içinde" yazıyor ve index.js içindeki reuqire(db3) çağrılıyor ve "db3 içinde" yazısından sonra tekrar index.js ten devam ederek "index içinde" yazıp sönen sonucu i ye atıyor.


21 Nisan 2015 Salı

Javascript Singleton Pattern


function Single(){
  if(Single.caller !== Single.getInstance){
     throw new Error("new ile çalıştırılamaz");
  }

  this.dt = new Date();
}

Single.getInstance = function() {
  // Single sınıfına ait instance static özelliği yaratılmadan önce
  console.dir(this);
debugger;
  if(this.instance === undefined){
    // this tanımı doğrudan sınıfı yani Single fonksiyonunu işaret edecektir
    this.instance = new Single();
  
    // Single sınıfının instance static özelliği yaratıldı
    // Ve bundan sonra bir daha yaratılmayıp sınıfa bağlı instance nesnesi gönderilecek
    console.dir(this);
  }
  return this.instance
}

// Single sınıfının static fonksiyonu olan getInstance üstünden tekil nesne çağırılır
a = Single.getInstance();

// new Anahtarıyla Single sınıfından bir nesne tanımlanamaz
a = new Single();

Peki node.js içinde nasıl olurdu? Unutmamalı ki require ile çağırdığımız tüm js dosyaları memorye bir kez yüklenir ve her require ile çağrıldığında artık file i/o yapmak yerine bellekten getirilir. Ve biz objemizi bir kez module.exports içine koydukmu bir daha yaratmak durumunda olmayız. Yukarıdaki kodu single.js olarak sakladığımızı düşünelim.
single.js
module.exports = Single.getInstance()
çağırdığımız dosya.js olsun:
module.exports = require('./single.js')

16 Nisan 2015 Perşembe

Fiddler ile SQL Server'dan yapılan Web Servis Çağrılarını İzlemek

Fiddler and Microsoft Sql Server

SQL Prosedürmüzde sp_OACreate ile Web Servisi çağrısı yapacağımız bir OLE nesnesi örneğini yaratıp üstünden bir HTTP paketi gönderebiliriz ama Fiddler bunu göstermeyecek. Haydi başlayalım...
Temel itibarıyla aşağıdaki basit kod ile herhangi bir web sayfasını mssql içinden çağırabilirsiniz:
DECLARE @Request INT,
  @hr INT,
  @activeX VARCHAR(50) = 'Msxml2.ServerXMLHTTP.6.0';

 SET @activeX = '{88d96a0b-f192-11d4-a65f-0040963251e5}';
 EXEC @hr = sp_OACreate @activeX, @Request OUT;
 SELECT @hr, @Request
 
 EXEC sp_OAMethod @Request, 'open', NULL, 'GET','https://www.random.org/cgi-bin/randbyte?nbytes=1307&format=h', 'false'
 EXEC sp_OAMethod @Request, 'send', null, ''
  
 DECLARE @ResponseText Varchar(4000)
 EXEC sp_OAMethod @Request, 'responseText', @ResponseText OUTPUT
 SELECT @ResponseText
 Exec sp_OADestroy @Request
 
 IF @hr <> 0
 BEGIN
       DECLARE @src varchar(255), @desc varchar(255)
    EXEC sp_OAGetErrorInfo @Request, @src OUT, @desc OUT 
    SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
    RETURN
 END
 ELSE
    Exec sp_OADestroy @Request

Ekşi Sözlük'te Ole tanımları:
Biraz anlatayım ne nedir diye. sp_OACreate ile MSSQL içinde bir OLE nesnesinin örneğini yaratır.

ole 2.0 kendi icinde (bkz: com) (bkz: activex) gibi teknolojileri icherir..

nesne baglama ve nesne gomme(yerleshtirme). bir yazilim tarafindan olushturulan bir nesnenin ozelliklerini kaybetmeden bashka bir yazilim tarafindan kullanilabilmesini saglar. bu tur nesneler uzerinde deishiklik yapmak istenirse nesne uzerinden orjinal yazilima baglanmak olanaklidir.

object linking and embedding kisaltmasidir turkcesi ise nesne baglama ve gömme olarak cevrile bilir microsoft office uygulamaları arasında verialı$veri$ini mümkün kılan teklojinin adıdır.ole'nin 2 farkli boyutta islem gormektedir.bunlar baglama ve gömme ne demek simdi bu derseniz sole ki excelde bi islem yaptınız worldbelgesine transferini yapmayı dusunuyorsunuz iste bu hadise bunu mumkun kılmaktadır.

Demek ki bizim bir nesnemiz var ve ondan bir örnek yaratıp, örneğimiz üzerinden işlemler yapmak istiyoruz.

Peki buradaki OLE nesnemiz olan Msxml2.ServerXMLHTTP.6.0 kimdir?

Önce MSXML'den başlayalım. Microsoft XML Core Services (MSXML) W3C uyumlu XML API leri ile yüksek performanslı XML temelli uygulamalar geliştirmeye yarar. Bu kısım biraz genişçe devam edebilir ama konumuzdan sapmayacağım. Neydi konumuz Fiddler ile SQL Server üstünden yaptığımız Web Servisi çağrılarını görüntülemek.
Sırada bu örneği yaratırken kullandığımız INT tipinde @hr ve @Request değişkenleri. @hr sayesinde bu örnekleme işimiz eğer 0 dan başka bir sonuç gelmişse HATA olarak değerlendirecek ve hatayı görüntülemek için IF @hr <> 0 satırını kullanacağız. Burada detaylandırılacak bir şey varsa ben bilmiyorum. Gelin ekran çıktılarına bakalım:

Peki BAŞARISIZ bir örneklendirmeye bakalım:

Açıktırki örneklendiremememiz makinede olmayan bir OLE nesnesini kullanmak arzumuzdan.
Msxml2.ServerXMLHTTP.6.0 OLE nesnesi sistemimizde kayıtlıyken

Msxml2.ServerXMLHTTP.5.0 Registry'de kayıtlı değil.
Sorgulamak için registry sorgusu da deneyebilirsiniz:
C:\>reg query hkcr /f xmlhttp

HKEY_CLASSES_ROOT\Microsoft.XMLHTTP
HKEY_CLASSES_ROOT\Microsoft.XMLHTTP.1.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.3.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.4.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.6.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.3.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.4.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.6.0
End of search: 10 match(es) found.

C:\>

Ayrıca OLE nesnelerimizi ProgId ya da ClsId ile çağırabiliriz

Peki CLS Id nedir?

Ya ProgId?

OLE nesnelerimizi eğer CLS ID leri ile yaratmak istersek önce CLS ID lerini nerede bulabileceğimize bakalım:

Ve şimdide CLS ID ile SQL içinde örnekleme işine bakalım:

Devamını yazacağım ama önce Verdi nin konserine gitmeliyim. Yarın devam ederim ;)

Bir Verdi Konseri harikaydı...

Fiddler SQL'i nasıl dinler

Normalde dinlemesini bekleriz ama Fiddler'e düşmez SQL web servis çağrılarınız. SQL Server sizin login olduğunuz oturum üstünden çalışmadığı için Fiddler görüntüleyemeyecektir.
Aşağıda nasıl yapacağımızı görelim:
Artık fiddler sql web service çağrılarını görebileceksiniz.

Neden tüm web servis çağrılarım Fiddler'e düşmüyor

Önce düşen web servis sonuçları var ve düşmeyen var. O halde sorunu tespit için fiddlere baktım ve http talebinin sonuçlarının boyutundan şüphelendim. Bunu test etmek için dönen cevabın boyutunu ayarlayabileceğim bir site buldum. Url adresinden dönecek sonucun boyutunu değiştirebilirsiniz https://www.random.org/cgi-bin/randbyte?nbytes=1324&format=h ve fiddler üstünde görebiliyorsunuz.
SQL kodumuzla çağrı yapalım ve sonucu SQL tarafından alınamayan durumu inceleyelim:
DECLARE @Request INT,
  @hr INT,
  @activeX VARCHAR(50) = 'Msxml2.ServerXMLHTTP.6.0';
  SET @activeX = '{88d96a0b-f192-11d4-a65f-0040963251e5}';

EXEC @hr = sp_OACreate @activeX, @Request OUT;
EXEC sp_OAMethod @Request, 'open', NULL, 'GET','https://www.random.org/cgi-bin/randbyte?nbytes=1307&format=h', 'false'
EXEC sp_OAMethod @Request, 'send', null, ''

DECLARE @ResponseText Varchar(4000)
EXEC sp_OAMethod @Request, 'responseText', @ResponseText OUTPUT
SELECT @ResponseText as Response
Exec sp_OADestroy @Request
 
IF @hr <> 0
BEGIN
   DECLARE @src varchar(255), @desc varchar(255)
   EXEC sp_OAGetErrorInfo @Request, @src OUT, @desc OUT 
   SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
   RETURN
END
ELSE
 Exec sp_OADestroy @Request

Bu kezde başarılı bir web sayfası çağrısını SQL'den yapalım:

Peki Sorun OLE Nesnesinde mi?

SQL'de göremiyoruz ama arada OLE nesnemiz var acaba sorun onda mı? OLE nesnemizin çektiği sonucu bir dosyaya yazalım ve görelim gelen cevabı kesiyor ya da kırpıyormu.
Test için yine fiddler ve OLE nesnemizden örneğimizi yazıp konsoldan çalıştırmak için bir script dosyası oluşturalım.
Dim oXMLHTTP
Dim oStream

Set oXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0")

Dim byteSize 
byteSize="1306"

oXMLHTTP.Open "GET", "https://www.random.org/cgi-bin/randbyte?nbytes="+byteSize+"&format=h", False
oXMLHTTP.Send

If oXMLHTTP.Status = 200 Then
 Wscript.Echo oXMLHTTP.responseBody
 Set oStream = CreateObject("ADODB.Stream")
 oStream.Open
 oStream.Type = 1
 oStream.Write oXMLHTTP.responseBody
 oStream.SaveToFile "c:\temp\sonuc"+byteSize+".txt"
 oStream.Close
End If
Yukarıdaki kodumuzun çalışması için MSXML nin internet explorer->internet options -> Security Settings -> Custom Level -> Access data sources accross domains -> Enable ayarının yapılması gerekecek:

4000 altındaki cevapları SQL içinde görebildiğimiz için öncelikle bunu dosyaya yazdırabiliyor muyuz diye bakalım:

SQL'e yazdıramadığımız sonucu bakalım dosyaya yazabilecek miyiz ve acaba OLE nesnemiz mi SQL'e aktarmıyor diye kontrol edelim:
Geldiğimiz noktada sorun sp_OACreate 'in NVarchar(4000) limitine takılmamızmış :) Öğrendiğim adres ve çözmek isterseniz çözümleri için buraya veya buraya tıklayabilirsiniz.

Bu noktadan sonra ben .Net assemblysi yazarak ilgili fonksiyonlarını çağırmayı tercih edeceğim :)

Azim ve bilgi dolu okumalar olsun....

JScript dosyalarınızı nasıl çalıştırırsınız?

JScript kodlarını derlemek için:
PATH ortamına dizini ekleyeceksiniz ki jsc derlenecekDosyaAdi.js dediğinizde jsc.exe dosyasını leb demeden bulsun sisteminiz.
  1. Use the Windows search feature to find jsc.exe on your drive. The exact name of the directory where jsc.exe is located depends on the name and location of the Windows directory and the version of the .NET Framework that is installed. If you have more than one version of the .NET Framework installed, you must determine which version to use (typically the latest version).
    For example, the compiler might be located at C:\Windows\Microsoft.NET\Framework\v2.0.50727.
  2. To display the System Information dialog box, right-click Computer or My Computer on the desktop, and then click Properties.
  3. If you are using Windows Vista or Windows 7, click Advanced System settings in the resulting Control Panel window.
  4. On the Advanced tab of the System Properties dialog box, click the Environment Variables button.
  5. Under System variables, select Path from the list and click Edit.
  6. In the Edit System Variable dialog box, move the cursor to the end of the string in the Variable Value box and type a semicolon (;) followed by the full directory name that you found in Step 1.
    For example, if the compiler is at the location specified in the example in Step 1, you would type the following:
    ;C:\Windows\Microsoft.NET\Framework\v2.0.50727
  7. Click OK to confirm your edits and close the dialog boxes.
  8. Open a new command prompt.

Yukarıda size .Net Framework 2.0 için yol göstermiş ama bende 4 versiyonu için yolu ve aradığımız jsc.exe dosyasını göstereyim. Böylece kimse bir daha PATH ne iş yapara Environment Variables ne iş yapar diye düşünmesin ;)

Kodumuz şu olsun:
print("Bu yazı bir exeden çıkacak");
Çıktımız ise şu:

14 Nisan 2015 Salı

DOS Batch ile SVN'de yüklü Solution'ların otomatik checkout edilmesi

Bulunduğum klasör ve proje dosyalarını indireceğimiz, yoksa yaratılacak klasör
cls
set currentDir = %cd%
set solutionDirName=\EInvoice_Solution
set solutionDirPath=%currentDir%%solutionDirName%
echo %solutionDirName%

if not exist "%solutionDirPath%" (mkdir %solutionDirPath%)

Repositoryler içinde gezerek ekranı çalıştıralım
cls
@echo off
set currentDir = %cd%
set solutionDirName=\EInvoice_Solution
set solutionDirPath=%currentDir%%solutionDirName%
echo %solutionDirName%

if not exist "%solutionDirPath%" (mkdir %solutionDirPath%)

SET repoPaths=(FMC.Turkiye.Data.EInvoice FMC.Turkiye.Lib.EInvoice FMC.Turkiye.Lib.EInvoice.WebServiceClasses FMC.Turkiye.Wcf.EFatura FMC.Turkiye.Web.Site.EFatura)

for %%s in %repoPaths% do TortoiseProc.exe /path:"%%s" /url:"https://xp-dev.com/svn/%%s/trunk" /closeonend:0 /command:checkout 


Sonuçta klasörümüzün haline de bakmalı:

7 Nisan 2015 Salı

Grunt, Mocha, Assert ve Should ile temel node.js uygulaması adımları

Grunt

Otomasyon için kullanacağız

Grunt temel taşımız
...:\> npm install -save-dev grunt

Hata olmaya müsait kodlarımız için erken uyarı sistemi:
...:\> npm install -save-dev grunt-contrib-jshint

Sürekli sistemi çalıştırmak yerine aktif olarak değişen dosyaları görünce çalıştırsın diye(bir nevi nodemon)
...:\> npm install -save-dev grunt-contrib-watch

Gruntfile.js ile otomasyon ayarlarımızı yapacağız.
module.exports = function(grunt){


    grunt.initConfig({
       // jshint: hangi klasör(/test/), alt klasörlerin hepsi(/**/) ve adı ne olursa olsun hangi dosya türlerinde(/*js) 
       //         olası sorunları inceleyecek
        jshint:{
            files:['test/**/*js']
        },
       // watch: hangi klasör(/test/), alt klasörlerin hepsi(/**/) ve adı ne olursa olsun hangi dosya türlerinin(/*js) 
       //        değişimlerinde otomasyon tekrar başlatarak hangi görevleri çalıştıracak
        watch:{
            files:['test/**/*js'],
            tasks:['jshint']
        }
    });

    grunt.loadNpmTasks("grunt-contrib-jshint");
    grunt.loadNpmTasks("grunt-contrib-watch");

}

JSDOC 3.3.0 beta

Eğer javascript dosyalarınızın belgelendirmesini istiyorsanız ve bunu jsdoc3 3.3.0 beta ile yapacaksınız ya kodlarınızın bulunduğu üst klasörlerin isimleri alt çizgi ile başlamayacak ya da node_modules/grunt-jsdoc/conf.json.EXAMPLE dosyasından aynı klasöre conf.json olarak oluşturup içindeki excludePattern'den _ çizgiyi kaldırmak için boşaltacaksınız excludePattern:"".
Sürekli aldığım sonuç aşağıdaki gibiydi:
C:\_Projeler\AdminLTE\trunk\node\batch>grunt jsdoc
Running "jsdoc:dist" (jsdoc) task
Documentation generated to C:\_Projeler\AdminLTE\trunk\doc
Done, without errors.
Ama bir türlü çıktı üretmiyordu. Bunu çözmek için C:\_Projeler\AdminLTE\trunk\node_modules\grunt-jsdoc\node_modules\jsdoc\conf.json.EXAMPLE adresindeki dosyanın bir kopyasını jsdoc_conf.json olarak Gruntfile.js ile aynı dizine kaydettim.

jsdoc_conf.json
{
  "tags": {
    "allowUnknownTags": true
  },
  "source": {
    "includePattern": ".+\\.js(doc)?$"
  },
  "plugins": [],
  "templates": {
    "cleverLinks": false,
    "monospaceLinks": false,
    "default": {
      "outputSourceFiles": true
    }
  }
}

ve gruntfile içinede şu taskı tanımladım:
module.exports = function (grunt) {
    grunt.initConfig({
        jsdoc: {
            dist: {
                src: ['jsdoc_test/*.js'],
                options: {
                    destination: 'doc',
                    configure : "jsdoc_conf.json"
                }
            }
        },.....

ve konsoldan grunt jsdoc dediğimde çalışmıştı. Underscore için tedirgin olmama gerek yok çünkü sunucu dizini içindeki dosylarımın ya da istemcideki kendi kodlarımın(bower'ın değil) js belgelendirmesini yapacağım.

MOCHA

Test için kullanacağımız çatı. İçerisinde SHOULD ve ASSERT kullanacağız.
Kurulmaları için yapmamız gereken:

Birim testleri yazmak için
...:\> npm install -save-dev assert

Davranışsal testler yazmak için
...:\> npm install -save-dev should

Bu testleri çalıştırıp bize rapor üretmesini sağlamak için
...:\> npm install -save-dev mocha

Mocha varsayılan olarak test klasöründeki js dosyalarını çalıştıracağından test klasörü içinde test dosyalarımızı tutacağız

Test edilecek dosyamız sanki DB'de Kullanıcı işmizi yaptığımız Kullanici.js dosyamız olsun.
Önce models/Kullanici.js:
// BDD yazmıyoruz bu kodun içinde. Basit Unit Test ler yazdık.
var assert = require("assert");

var Kullanici = function (args) {

    assert.ok(args.eposta && args.sifre, "EPosta ve Şifre boş bırakılamaz");

    var f_getKullanici = function (_eposta, _sifre) {
        return {
            id:1,
            adiSoyadi: 'Cem Topkaya',
            meslegi: 'Yüksek Uzay Müh.'
        }
    };

    var f_getSonGirisTarihi = function (_kullaniciId) {
        assert.ok(_kullaniciId, "Kullanıcı ID boş olamaz");
        return new Date('2015-04-07 21:51');
    };

    var temelBilgiler = f_getKullanici(args.eposta, args.sifre);

    // Dikkat! Revealing module patternini kullanıyoruz
    return {
        eposta: args.eposta,
        temelBilgiler: temelBilgiler,
        sonGirisTarihi: f_getSonGirisTarihi(temelBilgiler.id)
    }
};

module.exports = Kullanici;


Önce models/DB.js:
var Kullanici = require('./Kullanici');
var DB = {
    Kullanici:Kullanici
};

// Bir namespace gibi hazırlıyoruz.
module.exports = DB;

Test kodumuz nasıl peki:
var assert = require("assert"),
    should = require('should'),
    DB = require('./../models/DB.js');

describe("Sisteme Giriş", function () {

    describe("Kullanıcı Girişi", function () {

        // Aşağıdaki testler erişebilsin diye burada tanımlı
        var girisYapanKullanici = {};

        before(function () {
            // User modelimiz çalışıyorsa nesne yaratacaktır.
            girisYapanKullanici = new DB.Kullanici({eposta:'cem@cem.net', sifre:'test12test'})
        });



        it("kullanıcı temel bilgileri tanımlı", function () {
            girisYapanKullanici.temelBilgiler.should.be.defined;
        });

        it("şifre tanımlı");

        it("şifre 6 karakterden az değil");


    });

    describe("Kullanıcı Kayıdı", function () {

        // Aşağıdaki testler erişebilsin diye burada tanımlı
        var kayitBilgileri = {};

        before(function () {
            // Başlangıçta tanımlanacak bilgiler
            kayitBilgileri = {eposta:'cemEtCem.Net',sifre:'testSifresiRakamYok'};
        });

        it('Eposta tanımlı', function () {
            kayitBilgileri.eposta.should.be.defined;
        });

        it('Eposta doğru girilmiş', function () {
            assert.notEqual(kayitBilgileri.eposta.indexOf('@'),-1,'eposta @ karakteri içermiyor');
        });
        
        it('Şifre en az 6 karakter', function () {
            assert.ok(kayitBilgileri.sifre.length >= 6, 'Şifre en az 6 karakter olmalı!');
        });
    });
});

Konsol üstünden hızlıca çalıştırmak için mocha yı globale yükleyebilirsiniz ya da package.json içinde scripts/test özelliğini aşağıdaki gibi doldurabilirsiniz:
{
    "name": "jsPattern",
    "version": "0.0.0",
    "private": true,
    "scripts": {
        "test": "./node_modules/.bin/mocha --reporter spec",
        "start": "node ./bin/www"
    },
    "dependencies": {
        "body-parser": "~1.12.0",
        "cookie-parser": "~1.3.4",
        "debug": "~2.1.1",
        "express": "~4.12.2",
        "jade": "~1.9.2",
        "morgan": "~1.5.1",
        "serve-favicon": "~2.2.0"
    },
    "devDependencies": {
        "grunt": "^0.6.1",
        "grunt-contrib-jshint": "^0.6.1",
        "grunt-contrib-watch": "^0.6.1",
        "mocha": "^2.2.1",
        "should": "^5.2.0"
    }
}

Artık ...:\>npm test komutunu çalıştırdığımızda sonucumuz şöyle olacaktır:

Sanırım sonucu okumaya gerek yok. Yeşiller geçti kırmızılar kaldı.

Ekran görüntüleri:

Javascript Patterns

Javascript Pattern'ler:

Module, Revealing Module ve Prototype Pattern'in

Constructor Pattern:

Factory Pattern:

6 Nisan 2015 Pazartesi

360 derece anket soruları

Kendinize aşağıdaki soruları sorabilir ve geliştirebilirsiniz veya olduğunuz gibi kalabilirsiniz:
1 Kilit konulara ve hedeflere olan dikkatini bölünmelere rağmen korur.        
2 Hedeflerin gerçekleşmesi için kararlı şekilde hareket eder.        
3 Aksiyona geçerken ve öncesinde diğerlerinin hislerini göz önüne alır.        
4 İçtenlik ve iyimserlik yoluyla olumlu bir ortam yaratır.        
5 Gelecekle ilgili diğerlerini motive eden bir vizyon yaratır.        
6 Ek sorumluluklar vererek diğerlerine olan güvenini gösterir.        
7 "Ya…..ise…" soruları sorarak mevcut durumu ve varsayımları sorgular.        
8 Bir sorunun altta yatan nedenlerini ve sistemsel sebeplerini arar ve kavramlaştırır.        
9 Yeni fikirlerin yerleşik prosedürler ve süreçlere entegrasyonu için adımlar atar.        
10 Zor durumlarda düşünürken titizlik ve disiplin sergiler.
11 Büyük değişimlerin yaşandığı zamanlarda, görünür şekilde diğerleri için güven kaynağı oluşturur. Örneğin kilit hedef ve değerleri belirler.        
12 Kişilerin daha yüksek seviyede performansa ulaşmalarına yardımcı olmak için çeşitli yöntemler (sebep, ilham vs.) kullanır.        
13 Bakış açılarını; diyalogları olumlu yönde etkileyecek şekilde sunar ve ifade eder.        
14 İlgili bilgileri ve verileri sentezleyerek ve uygulayarak çözümleri şekillendirir.        
15 İnsanları birbirlerinin güçlü yanlarından faydalanmaları ve birlikte daha verimli çalışmaları için teşvik eder.        
16 Kısa dönemli aktivitelerin uzun dönemli stratejik hedefleri desteklediğinden emin olur.        
17 Özel dikkat gerektiren girişimleri veya projeleri ayırt eder ve hedefler.        
18 Ulaşılabilir hedefleri gerçekleştirmekle yetinmeyip, yeni hedefler koyar ve bunlara ulaşmak için çalışır.        
19 Her kişiye, onun yapısını dikkate alarak farklı davranır.        
20 Aksiliklerle karşılaşıldığında takımlara ve/veya bireylere güven verirken olgunluk gösterir.
21 Verdiği sözleri tutarak kişilerin güvenlerini ve bağlılıklarını kazanır.        
22 Kilit görevleri ve işleri delege ederek kişilere olan güvenini sergiler.        
23 Sorunlara çözüm ararken görünür olan çözümlere takılmaktansa alternatif çözümler arar.        
24 Karmaşık bir durumdaki birçok olasılığı açığa kavuşturacak fikirleri sezgisel olarak biçimlendirir.        
25 Bir projede doğru kişilerin yer aldığından emin olmak için süreçleri takip eder.        
26 Organizasyon içinde yer alan kilit kişilerle fikirleri ve varsayımları görüşerek dikkatli bir şekilde karar alır.        
27 Değişim sonucunda takımlarda ortaya çıkan aksaklıkları saptamaya ve çözümlemeye yardım eder.        
28 Diğerlerinin gelişim alanlarını yapıcı ve faydalı olacak şekilde fark etmelerine yardım eder.        
29 Fikirleri, kişilerin desteğini ve aksiyonlarını teşvik eden odaklı mesajlara dönüştürür.        
30 Zamanında karar vermek için seçenekler arasında titiz analiz verilerinden ve gerçeklerden yararlanarak ilerler.
31 Takım üyelerinin girdi sağlamalarını ısrarla ister ve katılımlarını teşvik eder.        
32 Değişimi öngörür ve fırsatlardan fayda sağlayacak ve tehditleri en aza indirecek şekilde kararlar verir.        
33 Kilit hedeflere enerjisini verirken zihnini tek bir konuya odaklar.        
34 Bir hedefe ulaşmak için olası engellerin üstesinden gelir.        
35 Duyguların ve hislerin etkilerini hesaba katar.        
36 Duygularını yapıcı bir şekilde filtreleme ve kontrol etme becerisi sergiler.        
37 Ortak çabalar için bağlılığı, kişilerin bireysel katkılarını överek ve takdir ederek güçlü bir şekilde teşvik eder.        
38 Konular veya davranışlar ile ilgili açık geri bildirim vererek diğerlerinin başarılarına bağlılık gösterir.        
39 Kutunun dışında düşünerek yeni iş fikirleri yaratma becerisi sergiler.        
40 Anahtar konular veya fırsatları ortaya çıkaran bilgiler, etkinlikler, vb. arasında bağlantılar kurar.
41 Organizasyonu, kritik ve birbirine üst seviyede bağlı olan iş süreçleri olarak algılar ve bu süreçleri göz önüne alarak hareket eder.        
42 Belirsizlik ve bilgi yığınlarını yönlendirerek fikirleri sistemli ve sistematik bir şekilde somutlaştırır.        
43 Kritik organizasyonel hedefler nedeniyle ortaya çıkan değişim ihtiyacı ile ilgili diğerlerini ikna eder.        
44 Çalışma arkadaşları, direk bağlı olunan kişilerle ilgili kritik gelişim meseleleri ve engellerini belirler ve onlarla yüzleşir.        
45 Hem bire bir hem de grup görüşmelerinde fikirlerini düzgün ve ikna edici şekilde sunar.        
46 Bir sorunun köklerini saptar; bir başka deyişle semptomları nedenlerden ayırır.        
47 Takımım ilerleyişine müdahale eden çatışmaları ve belirsizlikleri çözmek için uygun şekilde araya girer.        
48 Süreçlerin, sistemlerin ve ölçümlerin stratejik hedefleri desteklediğinden emin olur.        
49 Kısıtlı zaman ve/veya kaynaklarla karşılaştığında kilit görevlere odaklanır.        
50 İşlerin bitmesi için ne yapılması gerekiyorsa yapmak için isteklilik sergiler.
51 Kişilerin çeşitli psikolojik ve duygusal ihtiyaçlarını anlar.        
52 Aksilikleri kararlılıkla kabul ederek başarısızlıklarla başa çıkma konusunda model olur.        
53 Önemli taahhütleri yerine getirerek diğerleri için açık bir örnek teşkil eder.        
54 Diğerlerine, karar alma mekanizmalarına katılma ve sorumlulukları paylaşma gücü verir.        
55 Fikir ve kavram üretme ve/veya geliştirmede yaratıcılık gösterir.        
56 Somut olmayan verilerin, bilgilerin veya düşüncelerin daha iyi organize edilmesinde yeni ve farklı bakış açıları üretir.        
57 Organizasyon içinde süreçler geliştirerek ve aralarında bağlantılar kurarak başarılı şekilde uygulanmalarını sağlar.        
58 Bir problem için en iyi çözümü ararken mevcut alternatifleri titizlikle ve eleştirel bir tarzla analiz eder.        
59 Sürekli oluşan ve bazen çalkantılı olan değişimlere uyum sağlamak için yeni beceriler veya davranışlar öğrenir ve geliştirir.        
60 "Bunu yapamam" diyenler de dahil olmak üzere diğerlerine, güven duygusu telkin eder.        
61 Farklı paydaşların çatışan ihtiyaç ve isteklerini uzlaştırmak için ortak zemin bulur.        
62 Sorunları veya durumları daha kolay yönetilebilecek ayrı parçalara böler.        
63 Sonuçlara ulaşma ihtiyacı ile takım üyelerinin performansını ve becerilerini geliştirme fırsatlarını dengeler.        
64 Stratejik yönelimi net şekilde tanımlar ve iletir.        
65 Öncelikler listesinin en üstte yer alan %20'sine zamanının en az %80'ini ayırır.        
66 Yüksek standartlara ve performans düzeylerine ulaşabilmek için uzun dönemde dayanıklılık ve enerji sergiler.        
67 Kendi davranışlarının ve kararlarının diğer insanlar üzerindeki etkilerini göz önüne alır.        
68 Kendi duygularını tutarlı şekilde ifade ederek, katılım ve açık iletişimin gerçekleşmesini sağlar.        
69 Görünür aksiyonları ile organizasyonun paylaşılan hedeflerine ve değerlerine bağlılık konusunda örnek oluşturur.        
70 Kişilerin, kendi işleri ile ilgili sorumluluğu üzerlerine almaları ve başarılı sonuçlar üretmeleri için neye ihtiyaç duyuyorlarsa onları sağlar.
71 Gelişim ve kazanç potansiyeli olan yenilikçi kavramlar yaratır.        
72 Birbiriyle ilişkisiz gibi görünen bilgiler, olaylar vs. ile ilgili bir bütün elde etmek için sorular sorar.        
73 Kritik aksiyon adımlarını ve organizasyonel öğrenmeleri dokümante ederek süreç geliştirmek adına bağlılık gösterir.        
74 Sorunları, mantıklı ve iyi organize edilmiş bir tarzla düşünür.        
75 Değişimin uygulanmasında ortak engeller ve çareler sunabilecek kişileri belirler ve onlara yardımcı olur.        
76 Kişilere sorunları ve krizleri çözmek konusunda yardım eder.        
77 Kişilerle (iç ve dış) organizasyonun yararı için anlaşmalara varır.        
78 Umutsuz gibi görünen sorunlar da dahil olmak üzere sorunların nasıl çözülebileceğini bulur.        
79 Takım için vizyon yaratmak yerine ortak bir vizyon oluşturmak için takımla birlikte çalışır.        
80 Kapsamlı stratejileri belirli aksiyonlara ve kilometre taşlarına dönüştürür.

3 Nisan 2015 Cuma

SQL Server üstünden Web Servisine Çağrı Yapmak

USE [FEInvoice]
GO
/****** Object:  StoredProcedure [dbo].[WS_QueryOutboxInvoiceStatus]    Script Date: 04/03/2015 19:45:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[WS_QueryOutboxInvoiceStatus]
 @faturaUUID varchar(40),
 @username varchar(40)= NULL,
 @password varchar(40)= NULL,
 @invoiceStatus as Varchar(20) OUTPUT,
 @ResponseText as Varchar(8000) OUTPUT
AS
BEGIN
 SET NOCOUNT ON;

 IF(@username IS NULL OR @password IS NULL)
 BEGIN
  DECLARE @vkn VARCHAR(20),
    @gibPk VARCHAR(100);
    
  SELECT @username=UyumSoftKurumKullanicilari.kullaniciAdi, 
         @password=UyumSoftKurumKullanicilari.sifre,
         @vkn=Kurumlar.vergiNo,
         @gibPk=Kurumlar.gibPostaKutusu
    FROM UyumSoftKurumKullanicilari 
 INNER JOIN Kurumlar ON UyumSoftKurumKullanicilari.refKurum_id = Kurumlar.id 
 INNER JOIN FaturaNoOtomatik ON Kurumlar.vergiNo = FaturaNoOtomatik.vkn AND Kurumlar.gibPostaKutusu = FaturaNoOtomatik.gibPk
   WHERE (FaturaNoOtomatik.faturaUUID LIKE @faturaUUID)
  
  IF LEN(@username)=0 RAISERROR('Vergi numarası "%s", GİB Posta Kodu "%s" olan kuruma ait Uyumsoft Web Servislerini sorgulayabilecek kullanıcı bilgileri Fatura Numarası üreten veritabanında yok. Lütfen kullanıcı bilgilerinin veritabanına girilmesini sağlayınız ve tekrar deneyiniz!', 11, 1, @vkn, @gibPk)
 END

 
 BEGIN -- Sorgulamak için soap zarfını oluşturalım.
  DECLARE @Request INT
  Declare @Body as varchar(8000) = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
 <s:Header>
  <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
   <o:UsernameToken>
    <o:Username>'+@username+'</o:Username>
    <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">'+@password+'</o:Password>
   </o:UsernameToken>
  </o:Security>
 </s:Header>
 <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <QueryOutboxInvoiceStatus xmlns="http://tempuri.org/">
   <invoiceIds>
    <string>'+@faturaUUID+'</string>
   </invoiceIds>
  </QueryOutboxInvoiceStatus>
 </s:Body>
</s:Envelope>'  

  EXEC sp_OACreate 'MSXML2.ServerXMLHTTP', @Request OUT;
  EXEC sp_OAMethod @Request, 'open', NULL, 'post','https://efatura.uyumsoft.com.tr/Services/Integration', 'false'
  EXEC sp_OAMethod @Request, 'setRequestHeader', null, 'SOAPAction', 'http://tempuri.org/IIntegration/QueryOutboxInvoiceStatus'
  EXEC sp_OAMethod @Request, 'setRequestHeader', null, 'Content-Type', 'text/xml; charset=utf-8'
  EXEC sp_OAMethod @Request, 'send', null, @body
  
  EXEC sp_OAMethod @Request, 'responseText', @ResponseText OUTPUT
  
  -- Uyumsoft kullanıcı adı ve şifresi geçersiz. Raiseerror !
  IF (CHARINDEX('You dont have enough permission to access this system',@ResponseText) > 0) RAISERROR('Uyumsoft servislerini sorgulamak için tanımlı "%s" kullanıcı adı ve "%s" şifresi geçerli değildir. Lütfen geçerli kullanıcı adı ve şifresinin Fatura Numarası Üreten veritabanına girilmesini sağlayınız. Alınan cevap: %s',19,1, @username, @password, @ResponseText);
  -- Uyumsoftun yanıtı boş ya da cevap içeren zarf yok. Raiserror!
  IF (@ResponseText IS NULL OR CHARINDEX('Envelope', @ResponseText) = 0) RAISERROR (N'Uyumsoft QueryOutboxInvoiceStatus metodundan hata alındı. Dönen sonuç: %s', 19, 1, @ResponseText);
  
  BEGIN -- Fatura durumunu çekip VT'yi güncelleyelim
   IF CHARINDEX('<Value Status="', @ResponseText) > 0
   BEGIN
    -- Faturanın son durumu 
    DECLARE @indexStart INT
    DECLARE @indexEnd INT
    
    SET @indexStart = CHARINDEX('<Value Status="', @ResponseText)+LEN('<Value Status="')
    SET @indexEnd = CHARINDEX('" StatusCode=', @ResponseText)  
    
    SET @invoiceStatus=SUBSTRING(@ResponseText, @indexStart, @indexEnd-@indexStart)
   END
  END

  -- Request objesini sonlandırım belleği özgürleştirelim
  Exec sp_OADestroy @Request
 END
END


IsEInvoiceUser

POST https://efatura.uyumsoft.com.tr/Services/Integration HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/IIntegration/IsEInvoiceUser"
Host: efatura.uyumsoft.com.tr

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
 <s:Header>
  <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
   <o:UsernameToken>
    <o:Username>xxxxx</o:Username>
    <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">xxxxx</o:Password>
   </o:UsernameToken>
  </o:Security>
 </s:Header>
 <s:Body>
  <iseinvoiceuser xmlns:ns1='http://tempuri.org/'>
   <vkntckn>xxxxx</vknTckn>
  </IsEInvoiceUser>
 </s:Body>
</s:Envelope>

1 Nisan 2015 Çarşamba

Fiddler ile WCF servisini çağırmak

WSDL'ı parça parça aşağıdan okuyalım.

Çağıracağımız fonksiyonda iki farklı tipte iki parametre var QueryInboxInvoiceStatus(InvoiceLogin _invoiceLogin, string[] _invoiceIds)
İşte fonksiyonumuzun WSDL'daki ifadesi:
<xs:element name="QueryInboxInvoiceStatus">
 <xs:complexType>
  <xs:sequence>
   <xs:element xmlns:q29="http://schemas.datacontract.org/2004/07/FMC.Turkiye.Lib.EInvoice" minOccurs="0" name="_invoiceLogin" nillable="true" type="q29:InvoiceLogin"/>
   <xs:element xmlns:q30="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="_invoiceIds" nillable="true" type="q30:ArrayOfstring"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

_invoiceIds parametremiz string tipinde bir dizi. Bunda dikkat edeceğimiz husus xml namespace bilgisinin doğru yazılması. Karmaşık bir tip(complex type) olmadığı için detayı yok ama InvoiceLogin için var:
<xs:complexType name="InvoiceLogin">
 <xs:sequence>
  <xs:element minOccurs="0" name="Password" nillable="true" type="xs:string"/>
  <xs:element minOccurs="0" name="UserName" nillable="true" type="xs:string"/>
 </xs:sequence>
</xs:complexType>
2 tane string tipinde özelliği olan bir sınıf. Şuna benziyor olsa gerek:
class InvoiceLogin
{
  public string UserName;
  public string Password;
}
Şimdi xml namespace bilgileri fiddler ile talebimizi yaparken nasıl yer alıyor:


O halde bu web servis metodunu çağırdığımak için aşağıdaki http gövdesini kullanacağız:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <QueryInboxInvoiceStatus xmlns="http://gib.fresenius.com.tr/FEFatura">
   <_invoiceLogin xmlns:a="http://schemas.datacontract.org/2004/07/FMC.Turkiye.Lib.EInvoice" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:Password>şifremiz</a:Password>
    <a:UserName>kullanıcıAdı</a:UserName>
   </_invoiceLogin>
   <_invoiceIds  xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <b:string>353d5faf-f227-4600-8efe-3fb5ab0f1f48</b:string>
   </_invoiceIds>
  </QueryInboxInvoiceStatus>
 </s:Body>
</s:Envelope>

Bu da fiddler üstünden çağırmak için kullanacağımız http talebi ve cevabı:
POST http://localhost:53644/FEInvoice.svc HTTP/1.1
Content-Type: text/xml; charset=utf-8
VsDebuggerCausalityData: uIDPoxWgzmMUISZHhT9DgBmdvzAAAAAAA/+at96K6Uq35zPRjKxBIsVGn2pZnrlOgakzi+yKWdsACQAA
SOAPAction: "http://gib.fresenius.com.tr/FEFatura/IFEInvoice/QueryInboxInvoiceStatus" 
Host: localhost:53644
Content-Length: 677
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <QueryInboxInvoiceStatus xmlns="http://gib.fresenius.com.tr/FEFatura">
   <_invoiceLogin xmlns:a="http://schemas.datacontract.org/2004/07/FMC.Turkiye.Lib.EInvoice" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:Password>şifremizBudur</a:Password>
    <a:UserName>kullaniciAdimizBuOlsun</a:UserName>
   </_invoiceLogin>
   <_invoiceIds  xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <b:string>353d5faf-f227-4600-8efe-3fb5ab0f1f48</b:string>
   </_invoiceIds>
  </QueryInboxInvoiceStatus>
 </s:Body>
</s:Envelope>

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/8.0
X-SourceFiles: =?UTF-8?B?QzpcUHJvamVsZXJcRk1DLlR1cmtpeWUuV2NmLkVGYXR1cmFcdHJ1bmtcRkVJbnZvaWNlLnN2Yw==?=
X-Powered-By: ASP.NET
Date: Wed, 01 Apr 2015 10:07:45 GMT
Content-Length: 929

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <QueryInboxInvoiceStatusResponse xmlns="http://gib.fresenius.com.tr/FEFatura">
   <QueryInboxInvoiceStatusResult xmlns:a="http://schemas.datacontract.org/2004/07/FMC.Turkiye.Lib.EInvoice" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:Nesne i:nil="true"/>
    <a:hasError>false</a:hasError>
    <a:invoiceResult i:nil="true"/>
    <a:islem>QueryInboxInvoiceStatus Metodu</a:islem>
    <a:istisna i:nil="true"/>
    <a:lstWsResult>
     <a:WSResult>
      <a:Nesne i:nil="true"/>
      <a:hasError>false</a:hasError>
      <a:invoiceResult i:nil="true"/>
      <a:islem>QueryInboxInvoiceStatus Metodu</a:islem>
      <a:istisna i:nil="true"/>
      <a:lstWsResult/>
      <a:sonuc i:nil="true"/>
      <a:succeedTransaction>true</a:succeedTransaction>
     </a:WSResult>
    </a:lstWsResult>
    <a:sonuc i:nil="true"/>
    <a:succeedTransaction>false</a:succeedTransaction>
   </QueryInboxInvoiceStatusResult>
  </QueryInboxInvoiceStatusResponse>
 </s:Body>
</s:Envelope>

Uyumsoft WCF Servisine Talep

Şimdi bu talebi uyumsoft'un e-fatura servislerine nasıl yapabiliriz bakalım ve bilgimizi ikinci bir örnek ile ilerletelimki anlayışımız artsın.
Önce metodumuzu wsdl içinde bulalım:
soapAction servisi çağırırken hangi metodu çağıracağı bilgisini içeriyor.

input ile metoda verilecek parametreleri, output ile çıktı olarak üreteceği sonucu görüyorsunuz.

Peki parametrenin veri tipi ne?
ArrayOfString tipi olacak.

Şimdi talebimizi yapalım:
POST https://efatura.uyumsoft.com.tr/Services/Integration HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/IIntegration/QueryInboxInvoiceStatus"
Host: efatura.uyumsoft.com.tr
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Content-Length: 937


 
  
   
    kullaniciAdimiz
    şifremiz
   
  
 
 
  
   
    353d5faf-f227-4600-8efe-3fb5ab0f1f48
   
  
 

Ve cevabımız:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=giq1anjro5kiajmwxzar1t11; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 01 Apr 2015 11:26:03 GMT
Content-Length: 845


 
  
   
    2015-04-01T11:26:04.353Z
    2015-04-01T11:31:04.353Z
   
  
 
 
  
   
    
   
  
 

Kolay gelsin....