29 Mar

Sayfa Kodlaması Ne İşe Yarar Ki ?

Buraya eklediğim örnekleri mümkün olduğuca test etmeye çalışıyorum. Fakat, yine de hatanın önüne geçmek mümkün olmuyor.
Bloğumu ziyaret eden Mehmet SEVEN’den mail aldım. http://www.ersindogan.com/php-web-programlama/wsdli-nasil-okuyabiliriz adresindeki makaleyi okuduğunu, fakat ekteki örnek dosyaları çalıştıramadığını ve şöyle bir hata aldığını yazmıştı (Burdaki dosya yolları kendi bilgisayarımın yollarıdır) :

Fatal error: Uncaught SoapFault exception: [HTTP] Not Found in /home/dev/hosts/Workspace/WebServices/istemci.php:4 Stack trace: #0 [internal function]: SoapClient->__doRequest(‘__call(‘EchoTest’, Array) #2 /home/dev/hosts/Workspace/WebServices/istemci.php(4): SoapClient->EchoTest(‘Ersin’, ‘DOGAN’, ‘Merhaba Dunya’) #3 {main} thrown in /home/dev/hosts/Workspace/WebServices/istemci.php on line 4

Biraz kurcaladıktan sonra, wsdl içerisinde bulunan endpointURI (servis çağrılarının yapıldığı adresin) eksik olduğunu fark ettim :

Eksik Hali
http://localhost/Workspace/WebServices/
Doğru Hali
http://localhost/Workspace/WebServices/sunucu.php

Bu şekilde http://localhost/Workspace/WebServices/ çalışabilmesi için, sunucu.php dosyası içerisindeki kodun index.php dosyası içerisinde olması gerekirdi.Her ne kadar adı sunucu olarak da geçse, kendisi apache web suncusu olmadan çalışamayan bir php dosyasıdır. Bu yüzden adresleri bu durumu göz önünde bulundurarak oluşturmak gerekiyor.

Bunu düzelttikten sonra hatadan kurtulmak mümkün olmadı ama aldığım hata değişti :

Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in /home/dev/hosts/Workspace/WebServices/istemci.php:4 Stack trace: #0 /home/dev/hosts/Workspace/WebServices/istemci.php(4): SoapClient->__call(‘EchoTest’, Array) #1 /home/dev/hosts/Workspace/WebServices/istemci.php(4): SoapClient->EchoTest(‘Ersin’, ‘DOGAN’, ‘Merhaba Dunya’) #2 {main} thrown in /home/dev/hosts/Workspace/WebServices/istemci.php on line 4

Bu, sunucu.php dosyasında birşeylerin yanlış gittiğini gösteriyor. Normalde, sunucu.php dosyası kodu çalıştırdıktan sonra geriye cevap olarak XML dosyası göndermekte. Hatanın sebebini bulmak için kodu birazcık güncelledim :

$istemci=new SoapClient(‘test.wsdl’,array(‘trace’=>1));
try{
echo $istemci->EchoTest(‘Ersin’,’DOGAN’,’Merhaba Dunya’);
}catch(Exception $e){
echo ‘‘,$istemci->__getLastResponse(),’‘;
}

Ve asıl hatamıza ulaştık :

Fatal error: SOAP-ERROR: Encoding: string ‘Merhaba Ersin DOGAN Mesaj\xfd…’ is not a valid utf-8 string in /home/dev/hosts/Workspace/WebServices/sunucu.php on line 10 Call Stack: 0.0002 333680 1. {main}() /home/dido/hosts/Workspace/WebServices/sunucu.php:0 0.0006 340284 2. SoapServer->handle() /home/dev/hosts/Workspace/WebServices/sunucu.php:10

sunucu.php dosyasını incelediğimde (file -i sunucu.php komutunu çalıştırarak):

1
sunucu.php: text/x-php; charset=iso-8859-1

dosyanın kodlamasının iso-8859-1 olduğunu gördüm. SoapServer varsayılan olarak utf8 ayarlı olduğu için, dosya içeriğinin ISO-8859-1 kod seti ile oluşturulmuş olması, sunucu.php dosyasının bu kod setinin desteklemediği karakterler ile karşılaşmasından dolayı hata vermesine sebep oluyormuş. Bunu çözmek için komut satırından :

1
iconv -f ISO-8859-1 -t UTF-8 sunucu.php>sunucu_utf8.php

çalıştırıp, işlem başarı ile tamamlanınca sunucu.php dosyasını silip, sunucu_utf8.php dosyasını da sunucu.php olarak yeniden adlandırmak tüm sorunlarıma çözüm oldu.

Eğer linux kullanmıyorsanız, kodlar için yeni dosyalar açıp, kodları bu yeni dosyalara yazmanız ( kopyala yapıştır yapmadan) da sorununuzu çözecektir.

Bu ilginç hata ile, hatalı dosya kodlamasının başa ne dert açabileceğini görmeme sebep olduğu için Mehmet SEVEN arkadaşa da burdan teşekkür etmek isterim 🙂

26 Apr

C# Yazılarım Üzerine

Sitede bulunan, C# üzerine yazmış olduğum yazılar artık güncelliğini kaybetmek üzere (belki de kaybetmiştir).
Bundan sonra da C# üzerine yazı hazırlamayı pek düşünmüyorum. Çünkü C# kullanmayalı uzun bir zaman oldu (en son .Net 3.5 vardı, şimdi hangi sürüm var bilmiyorum ).
Yazıları kaldırmak istemiyorum, hala faydalananlar olabilir düşüncesi ile yazıları tutuyorum.

Bilgilerinize.