CRM web servisi bir web servisinin doğası gereği soap ile iletişim kurmakta
ve işlenen hataları da soap içinde xml ile döndürmektedir.
Microsoft Dynamics CRM Web Servisi'nde Request parametresi kullanılarak bir
çağrı yaptığınızda hata olarak System.Web.Services.Protocols.SoapException
sınıfından ortak bir hata mesaj yapısı döner.
SoapException'ın Message property'si her zaman
için "Server was unable to process request." hatasını döndürür.
SoapException içerisinde Detail property'si oluşmuş olan
hata hakkında daha fazla bilgi verecektir. Detail property bir
XmlNode türündendir ve InnerXml property
aşağıdaki formatta hatayı sunmaktadır.
<error>
<description>Error description goes here.</description>
<code>0xABCD1234</code>
<type>Platform</type>
</error>
ErrorCode yani xml içerisindeki Number
hexadecimal türündedir. Örnek verecek olursak; eğer veritabanında olmayan bir
fax'ı çağırmaya kalkalsanır hata aşağıdaki şekilde olacaktır:
<error>
<code>0x80041103</code>
<description>'Lead' entity doesn't contain attribute with Name = 'name'.</description>
<type>Platform</type>
</error>
Standart bir kodlama mantığında catch bloğunda bu hatayı
aşağıdaki şekilde yakalabiliriz.
catch (System.Web.Services.Protocols.SoapException
ex)
{
Message =
ex.Message;
Detail =
ex.Detail.InnerText;
}
Bu şekilde hatayı öğrenebiliriz ama detaylı ve güzel bir hata mesajı olmaz
son kullanıcı için. Tabii burada bu hataları loglayacak bir yapı oluşturabiliriz
bu tercihinize kalmış ama her durumda detaya ihtiyacımız var.
CRM'in detaylı hata kod listesine
buraya tıklayarak ulaşabilirsiniz.
Hata yapısı ve içeriği hakkında bu bilgileri verdikten sonra bu hataları
yakalayacak kodu vermek güzel olacak sanırım :) Aşağıda kodu ve açıklamasını
bulabilirsiniz.
/// <summary>
///
Hatalari yakaliyoruz.
///
</summary>
///
<param name="ex">System
Exception</param>
///
<returns>hatanin
detayli aciklamasi</returns>
private
string HandleException(Exception
ex)
{
string Error =
"Uygulama bir hata ile karsilasti."
+ System.Environment.NewLine;
Error +=
"Message : "
+ ex.Message + System.Environment.NewLine;
if (ex.InnerException
!= null)
Error += ex.InnerException.Message + System.Environment.NewLine;
SoapException se
= ex as
SoapException;
if (se !=
null)
{
Error +=
"Code : "
+ GetError(se.Detail, "//code")
+ System.Environment.NewLine;
Error +=
"Desription : "
+ GetError(se.Detail, "//description")
+ System.Environment.NewLine;
Error +=
"Type : "
+ GetError(se.Detail, "//type")
+ System.Environment.NewLine;
}
return Error;
}
///
<summary>
///
SoapException.Detail icerisindeki hatayi dondurur
///
</summary>
///
<param name="errorInfo">hatayi
iceren XmlNode'u.</param>
///
<param name="item">geri
dondurulecek hata.</param>
///
<returns>hata
detayi ya da bos icerik.</returns>
private
string GetError(XmlNode
errorInfo,string
item)
{
XmlNode code =
errorInfo.SelectSingleNode(item);
if (code !=
null)
return
code.InnerText;
else
return
"";
}
- Burada dikkat edilmesi gereken şey hatanın SoapException sınıfı türünden
olup olmadığını kontrol ettiğimiz kısım;
SoapException se
= ex as
SoapException;
eğer içerik SoapException türünden ise detayını öğrenmek isityoruz. ( "as"
ifadesi hakkında daha fazla bilgi almak için
buraya tıklayınız.)
- Yukarıda hata durumunda dönecek Xml içeriğini verdim. Bu bir Xml olduğu
için XmlNode'larına erişerek istediğimiz bilgiyi alalım. İşte GetError bu
işe yarıyor. Soap Exception'ın Detail'ını ve istediğimiz node'u söylüyoruz
bize geri dönüyor.
GetError(se.Detail,
"//code")
Bu kod sonucunda elde ettiğimiz hata mesajı;
Uygulama
bir hata ile karsilasti.
Message : Server was unable to process request.
Code : 0x80041103
Desription : 'Lead' entity doesn't contain attribute with Name = 'name'.
Type : Platform
Bir makalemizin daha sonuna geldik umarım faydalı olmuştur.
Barış KANLICA
Yazılım Uzmanı – Software Specialist
brsk@e-kolay.net
www.cub-e.net
forum.cub-e.net
fa2286eb-bad3-4cab-84ab-c6610f258d0f|0|.0
Dynamics CRM
microsoft, dynamics, crm, 3.0, 4.0, type, sdk, entity, attribute, class, web, service, servisi, error, hata, soapexception, xmlnode, innerxml, handleexception, platform, system.web.services, protocols, soapexception