1

タイトルは私が知りたいことを表していると思います。ほとんどの場合、WCF サービスは例外を返します。サービスで例外を処理したとしても、正確なNotFound例外が何かを理解するのが難しい何かを返します。知りたい 正確な WCF 例外を Silverlight クライアントに返すクリーンで良い方法はありますか?

4

1 に答える 1

2

わかりました、これはあなたがすべきことです:

public App()
{
    ...
    this.UnhandledException += this.Application_UnhandledException;
    ...
}

private void Application_UnhandledException(object sender, 
        ApplicationUnhandledExceptionEventArgs e)
{
    if(e.Exception is YourException){
        //show a message box or whatever you need
        e.Handled = true; //if you don't want to propagate
    }
}

編集:

WPF

public App()
{
    this.Dispatcher.UnhandledException += 
        new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(
            Dispatcher_UnhandledException);
}

void Dispatcher_UnhandledException(object sender, 
    System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    if(e.Exception is YourException){
        //show a message box or whatever you need
        e.Handled = true; //if you don't want to propagate
    }
}

ここに記載されているように、エラー プロパティを確認できます: Silverlight で WCF 例外をキャッチする最良の方法?

Behaviorまたは、クラスにを追加することもできますServiceHost

public ServiceHost(Type t, params Uri[] baseAddresses) :
            base(t, baseAddresses) { }

protected override void OnOpening()
{
    base.OnOpening();

    //adding the extra behavior
    this.Description.Behaviors.Add(new ExceptionManager());

ExceptionManager次に、次のようなクラスを作成します。

public sealed class ExceptionManager : IServiceBehavior, IErrorHandler

そして、次のProvideFaultように呼び出されるメソッド:

void IErrorHandler.ProvideFault(Exception error, MessageVersion version, 
    ref Message fault)
{
    if (error == null)
        throw new ArgumentNullException("error");

    Fault customFault = new Fault();

    customFault.Message = error.Message

    FaultException<Fault> faultException = new FaultException<Fault>(customFault,
        customFault.Message, new FaultCode("SystemFault"));
    MessageFault messageFault = faultException.CreateMessageFault();
    fault = Message.CreateMessage(version, messageFault, faultException.Action);
}

使用するにはServiceHost

クラスを作成しますServiceHostFactory:

public class ServiceHostFactory : 
    System.ServiceModel.Activation.ServiceHostFactory
{
    protected override System.ServiceModel.ServiceHost CreateServiceHost(Type t, 
        Uri[] baseAddresses)
    {
        return new ServiceHost(t, baseAddresses);
    }
}

サービスを右クリックしView Markup、タグを選択して追加します。

Factory="YourNamespace.ServiceHostFactory" 
于 2013-01-17T17:57:35.967 に答える