Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Hatalar örneği, bir hizmetten istemciye hata bilgilerini nasıl ileteceklerini gösterir. Örnek, Başlarken esas alınarak, dahili bir istisnanın bir hataya dönüştürülmesi için servise bazı ek kodlar eklenmiş halidir. İstemci, hizmette bir hata koşulunu zorlamak için sıfıra bölmeyi dener.
Uyarı
Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.
Hesap makinesi sözleşmesi, aşağıdaki örnek kodda gösterildiği gibi bir FaultContractAttribute öğesini içerecek şekilde değiştirilmiştir.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
int Add(int n1, int n2);
[OperationContract]
int Subtract(int n1, int n2);
[OperationContract]
int Multiply(int n1, int n2);
[OperationContract]
[FaultContract(typeof(MathFault))]
int Divide(int n1, int n2);
}
FaultContractAttribute özniteliği, Divide işleminin MathFault türünde bir hata döndürebileceğini gösterir. Hata, serileştirilebilen herhangi bir türde olabilir. Bu durumda, MathFault aşağıdaki gibi bir veri sözleşmesidir:
[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public class MathFault
{
private string operation;
private string problemType;
[DataMember]
public string Operation
{
get { return operation; }
set { operation = value; }
}
[DataMember]
public string ProblemType
{
get { return problemType; }
set { problemType = value; }
}
}
Divide yöntemi, aşağıdaki örnek kodda gösterildiği gibi sıfıra bölme hatası oluştuğunda FaultException<TDetail> hatası atar. Bu özel durum istemciye bir hata gönderilmesine neden olur.
public int Divide(int n1, int n2)
{
try
{
return n1 / n2;
}
catch (DivideByZeroException)
{
MathFault mf = new MathFault();
mf.operation = "division";
mf.problemType = "divide by zero";
throw new FaultException<MathFault>(mf);
}
}
İstemci kodu sıfıra bölme isteğinde bulunarak bir hataya zorlar. Örneği çalıştırdığınızda, işlem istekleri ve yanıtları istemci konsolu penceresinde görüntülenir. Sıfıra bölme işleminin hata olarak bildirildiğini görürsünüz. İstemciyi kapatmak için istemci penceresinde ENTER tuşuna basın.
Add(15,3) = 18
Subtract(145,76) = 69
Multiply(9,81) = 729
FaultException<MathFault>: Math fault while doing division. Problem: divide by zero
Press <ENTER> to terminate client.
İstemci bunu uygun FaultException<MathFault> özel durumu yakalayarak yapar:
catch (FaultException<MathFault> e)
{
Console.WriteLine("FaultException<MathFault>: Math fault while doing " + e.Detail.operation + ". Problem: " + e.Detail.problemType);
client.Abort();
}
Varsayılan olarak, beklenmeyen özel durumların ayrıntıları, hizmet uygulamasının ayrıntılarının hizmetin güvenli sınırından kaçmasını önlemek için istemciye gönderilmez.
FaultContract bir sözleşmedeki hataları açıklamanın ve istemciye iletim için uygun olan belirli özel durum türlerini işaretlemenin bir yolunu sağlar.
FaultException<T> tüketicilere hata göndermek için çalışma zamanı mekanizmasını sağlar.
Ancak, hata ayıklama sırasında bir hizmet hatasının iç ayrıntılarını görmek yararlıdır. Daha önce açıklanan güvenli davranışı kapatmak için, sunucudaki işlenmeyen her özel durumun ayrıntılarının istemciye gönderilen hataya dahil edilmesi gerektiğini belirtebilirsiniz. Bu, IncludeExceptionDetailInFaultstrue olarak ayarlanarak gerçekleştirilir. Kodda veya yapılandırmada aşağıdaki örnekte gösterildiği gibi ayarlayabilirsiniz.
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
Ayrıca, yapılandırma dosyasındaki hizmetin özniteliği "CalculatorServiceBehavior" olarak ayarlanarak behaviorConfiguration davranış hizmetle ilişkilendirilmelidir.
İstemcide bu tür hataları yakalamak için genel olmayan FaultException'nin yakalanması gerekir.
Bu davranış yalnızca hata ayıklama amacıyla kullanılmalı ve üretimde hiçbir zaman etkinleştirilmemelidir.
Örneği ayarlamak, derlemek ve çalıştırmak için
Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.
Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.
Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.