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