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

11 Ocak 2018 Perşembe

AX 2012 - Uyumsoft E-fatura servisini kullanma

Önce Uyumsoft'un WSDL adresine (https://efatura.uyumsoft.com.tr/Services/Integration?wsdl) daha önce bloğumda bahsettiğim şekilde bağlanan bir servis referansı oluşturun. Servis referansındaki App.Config dosyasına aşağıda kırmızı ile işaretlediğim parametreleri ekleyin. Bunları eklemediğiniz takdirde Uyumsoft varsayılan değer olan 65.536'dan büyük bloklar göndereceği için hata alacaksınız:

 <binding name="BasicHttpBinding_IIntegration"  maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">

class SNBuyum
{
    uyumAX.uyumServis.IntegrationClient wsClient;
    uyumAX.uyumServis.PagedQueryContext pq;
    uyumAX.uyumServis.SystemUsersResponse res;
    uyumAX.uyumServis.PagedResponseOfSystemUser s;
    uyumAX.uyumServis.SystemUser[] u;
    uyumAX.uyumServis.SystemUser u2;

    System.ServiceModel.Description.ClientCredentials clientCredentials;
    System.ServiceModel.Security.UserNamePasswordClientCredential userPass;

    EInvoiceTRParameters                param;
}


void getEinvoiceUserList()
{
    CLRObject                             clientType;
    int i,j,k,l;
    System.Exception ex;


    new InteropPermission(InteropKind::ClrInterop).assert();

    param = EInvoiceTRParameters::find();

    clientType = CLRInterop::getType("uyumAX.uyumServis.IntegrationClient");
    wsClient = AifUtil::createServiceClient(clientType,"https://efatura.uyumsoft.com.tr/services/Integration");

    clientCredentials = wsClient.get_ClientCredentials();

    userPass = clientCredentials.get_UserName();
    userPass.set_UserName(param.UserID);
    userPass.set_Password(param.Password);

    pq = new uyumAX.uyumServis.PagedQueryContext();
    pq.set_PageIndex(0);


    try
    {
        res = wsClient.GetEInvoiceUsers(pq);

        s = Res.get_Value();

         i =   s.get_TotalPages();



        info(strfmt("%1",i));
        for (l=1;l<=i;l++)
        {
            pq.set_PageIndex(l);
            res = wsClient.GetEInvoiceUsers(pq);
            s = Res.get_Value();
            U = s.get_Items();
            k = u.get_Count();
            info(strFmt("%1",k));

            for (j=0;j<k;j++)
            {
                u2 = u.get_Item(j);
                info(u2.get_Title());
            }
            break; //sadece ilk sayfayı al ve çık (örnek dökümü hızlı almak için konuldu.)...
        }
    }
    catch(Exception::CLRError)
    {
        ex = ClrInterop::getLastException();
        if (ex != null)
        {
            ex = ex.get_InnerException();
            if (ex != null)
            {
                error(ex.ToString());
            }
        }

    }
}

Yukarıdaki örnek sisteme kayıtlı efatura kullanıcılarının listesini almak içindi. Diğer fonksiyonları da örnekten yararlanarak yapabilirsiniz.

Not: Sizin kodunuzda uyumAX.uyumServis yerine oluşturduğunuz referansa verdiğiniz isme göre farklı bir adres yazmanız gerekebilir.

10 Şubat 2015 Salı

C# - TC kimlik sorgulama web servisi client örneğinden COM uyumlu DLL oluşturma ve bunu App.Config dosyası olmadan kullanabilme

Bir makaleden öğrendiğim aşağıdaki direktifle DLL dosyanızın COM uyumlu olmasını sağlarsınız:


[ComVisible(true)] 

Ayrıca projenin özelliklerinde build sekmesinde Register for COM interop checkboxı işaretli olmalı.

Bunun sayesinde de COM nesnesini kullanırken Intellisense kullanabilirsiniz:

[ClassInterface(ClassInterfaceType.AutoDual)] 

 Tüm bunları yaptıktan sonra yine de bu DLL dosyasını direk kullanamazsınız. Kullanmaya kalktığınızda "OLE IDispatch exception code 0 from System.ServiceModel: ServiceModel..." gibi bir hata alırsınız. Ya app.config dosyasını EXEDosyaAdı.EXE.App.Config olarak çağıran programın olduğu klasöre kopyalayacaksınız ya da aşağıdaki kod parçasındaki kırmızı işaretli yerleri ekleyeceksiniz (Bunun için de Paul Mrozowski'den yardım aldım):

Örnekteki TC kimlik servisini C# Class Library türünde oluşturulan projenize eklemek için Service References üzerinde sağ mouse, Add Service Reference-> adres https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx ve GO yapmalısınız.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.ServiceModel;



namespace TCKimlik
{
    [ComVisible(true)] //COM nesnesi olarak görülebilmesini sağlar
    [ClassInterface(ClassInterfaceType.AutoDual)] //COM nesnesi olarak kullanırken intellisense sağlar
    [ProgId("TCKimlik.TCSorgula")] //COM nesne adı
   
    public class TCKimlikClass
    {
        public bool Dogrula(string adi,string soyadi,Int64 tc,Int32 dogumT)
        {
            bool ret = false;

            //------ APP.CONFIG dosyası gerekmemesi için.
            BasicHttpsBinding binding = new BasicHttpsBinding();
            EndpointAddress address = new EndpointAddress("https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx");

            //------ Sorgula --------
                try
            {
                Sorgula.KPSPublicSoapClient servis = new Sorgula.KPSPublicSoapClient(binding, address);

                ret = servis.TCKimlikNoDogrula(tc, adi, soyadi, dogumT);
            }
            catch
            {
            }
            return ret;
        }
    }
}


Artık bu DLL sadece .NET değil, klasik COM DLL destekleyen dillerle de kullanılabilir. Ancak bu DLL dosyasını setup olmadan taşırsanız hedef bilgisayarda regasm ile kaydetmeniz gerekir. Projenin tamamını hazır DLL ile bu ekte paylaştım.

Aşağıdaki örnekte Microsoft Visual Foxpro ile kullanımı var:

o=CREATEOBJECT("tckimlik.tcsorgula")
?o.Dogrula("METİN","EMRE",11111111111,1980)

Güncelleme:
Bazen .DLL dosyasını register ettikten sonra kullanırken "80131509 unknown com status code" hatası alabilirsiniz. Bunun için DLL'yi strong name ile imzalamanız gerekiyor.
Önce Visual Studio içinde zaten var olan SN.EXE ile bir key dosyası oluşturuyoruz:

 sn -k MyKeyFile.snk

Sonra da Visual Studio->İmzalama->Bütünleştirilmiş kodu imzala checkbox'unu seçtikten sonra MyKeyFile.snk dosyasını seçip derleme yapıyoruz.

2 Ekim 2014 Perşembe

AX 2012 - TC kimlik no sorgulama ile örnek web servisi kullanımı

Bu örneği geliştirirken bir blogdan faydalandım. Kullanıma hazır class halini buradan indirebilirsiniz.

1- Visual Studio'ya girip Class Library tipinde yeni bir C# projesi oluşturun.

2- Proje adındayken sağ klik Add service reference ile Address kısmına https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL, Namespace kısmına  Sorgula yazarak GO butonuna basarak servis referansını ekleyin.

3- Projenizi Add to AOT ile AOT'a ekleyin.

4- Projenin properylerine girip

Debug Target = No
Deploy to Client = Yes
Deploy to EP = No
Deploy to Server = Yes
Deploy to SSRS = No 

yapın.

5. Deploy yapıp tüm AX clientleri kapatın. Deploy esnasındaki mesajda tüm clientler kapatılmadıkça deploy işleminin tamamlanmayacağı yazıyor. Sanırım blog yazarı da bu yüzden clientları resetleyin diye uyarıyor.

Bu da benim örnek Jobum:

//Metin Emre, 2.10.2014
static void TCKimlikTest(Args _args)
{
    CLRObject                             clientType;
    TCKimlik.Sorgula.KPSPublicSoapClient  cl;
    System.Exception                      ex;
    boolean                               s,erOccured;
    System.Exception                      e;
    str                                   ret;

    new InteropPermission(InteropKind::ClrInterop).assert();

    try
    {
        clientType = CLRInterop::getType("TCKimlik.Sorgula.KPSPublicSoapClient");
        cl = AifUtil::createServiceClient(clientType);
        s = cl.TCKimlikNoDogrula(11111111111,"METİN","EMRE",1999);
    }
    catch(Exception::CLRError)
    {
        Ex=CLRInterop::getLastException();
        ret = Ex.ToString();
        if (!strScan(ret,"T.C. Kimlik No alanına girdiğiniz değer geçerli bir T.C. Kimlik Numarası değildir",1,strLen(Ret)))
        {
            info(Ex.ToString());
            erOccured = true;
        }
    }
    if (!erOccured)
        info(strFmt("%1",s));
}