为什么我的 WCF FaultException 未处理?
Why is my WCF FaultException unhandled?
我有一个基于以下合同(删节)的服务:
[ServiceContract]
public interface ISchedulerService
{
[OperationContract]
void Process(bool isForced);
}
实施的相关(恕我直言)部分是:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, UseSynchronizationContext = false)]
public class SchedulerService : ISchedulerService
{
public async void Process(bool isForced)
{
try
{
var prevStatus = Status;
Status = SchedulerStatus.Processing;
await ProcessListings();
Status = prevStatus;
}
catch (Exception ex)
{
throw new FaultException(ex.Message);
}
}
private static Task ProcessListings()
{
throw new Exception("ProcessListings failed.");
return Task.Delay(5000);
}
}
该服务目前托管在一个微型控制台应用程序中:
class Program
{
private static readonly SchedulerService Scheduler = SchedulerService.Instance;
private static ServiceHost schedulerHost;
protected static void OnStart()
{
try
{
if (schedulerHost != null)
{
schedulerHost.Close();
schedulerHost = null;
}
schedulerHost = new ServiceHost(Scheduler);
schedulerHost.Open();
Scheduler.Start();
}
catch (Exception ex)
{
//EventLog.WriteEntry("Exception: " + ex.Message);
throw;
}
}
}
最后,客户:
private readonly SchedulerServiceClient _proxy= new SchedulerServiceClient();
...
void ExecuteProcessNowCommand()
{
try
{
_proxy.Process(true);
}
catch (Exception ex)
{
if (exception is SchedulerException)
{
MessageBoxFacility.ProcessingError((SchedulerException)exception);
}
}
}
其中 SchedulerServiceClient
是我添加服务引用时生成的代理。到目前为止,我已成功在实时 Windows 服务中托管 WCF 并测试了非异常功能。在我添加异常处理之前一切都很好。我知道这是一个复杂的场景,但我看到的大多数示例表明 FaultException
至少会被客户端中的通用 Exception
处理程序捕获。我的调试器让我猜测异常甚至没有到达代理,并且它在 MVC 代码中仍未处理。当我点击 'continue' 足够时,我最终会看到一个屏幕,告诉我堆栈只包含外部代码。这是该外部代码的堆栈跟踪:
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__1(Object state)
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()</ExceptionString></Exception></TraceRecord>
这让我觉得我在 MCV 服务中使用 async
可能我扮演了一个角色,但也许它只是一个无辜的中间人。请帮我尝试确定为什么异常甚至没有传播到客户端。
async
方法中的异常存储在 returned 任务中。 async void
方法不 return 任务,因此在 ThreadPool
线程上抛出异常以拆除 AppDomain
.
不要在事件处理程序以外的任何地方使用async void
。
如果您 return 一个任务,您可以 await
该任务和异常将被重新抛出。
我有一个基于以下合同(删节)的服务:
[ServiceContract]
public interface ISchedulerService
{
[OperationContract]
void Process(bool isForced);
}
实施的相关(恕我直言)部分是:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, UseSynchronizationContext = false)]
public class SchedulerService : ISchedulerService
{
public async void Process(bool isForced)
{
try
{
var prevStatus = Status;
Status = SchedulerStatus.Processing;
await ProcessListings();
Status = prevStatus;
}
catch (Exception ex)
{
throw new FaultException(ex.Message);
}
}
private static Task ProcessListings()
{
throw new Exception("ProcessListings failed.");
return Task.Delay(5000);
}
}
该服务目前托管在一个微型控制台应用程序中:
class Program
{
private static readonly SchedulerService Scheduler = SchedulerService.Instance;
private static ServiceHost schedulerHost;
protected static void OnStart()
{
try
{
if (schedulerHost != null)
{
schedulerHost.Close();
schedulerHost = null;
}
schedulerHost = new ServiceHost(Scheduler);
schedulerHost.Open();
Scheduler.Start();
}
catch (Exception ex)
{
//EventLog.WriteEntry("Exception: " + ex.Message);
throw;
}
}
}
最后,客户:
private readonly SchedulerServiceClient _proxy= new SchedulerServiceClient();
...
void ExecuteProcessNowCommand()
{
try
{
_proxy.Process(true);
}
catch (Exception ex)
{
if (exception is SchedulerException)
{
MessageBoxFacility.ProcessingError((SchedulerException)exception);
}
}
}
其中 SchedulerServiceClient
是我添加服务引用时生成的代理。到目前为止,我已成功在实时 Windows 服务中托管 WCF 并测试了非异常功能。在我添加异常处理之前一切都很好。我知道这是一个复杂的场景,但我看到的大多数示例表明 FaultException
至少会被客户端中的通用 Exception
处理程序捕获。我的调试器让我猜测异常甚至没有到达代理,并且它在 MVC 代码中仍未处理。当我点击 'continue' 足够时,我最终会看到一个屏幕,告诉我堆栈只包含外部代码。这是该外部代码的堆栈跟踪:
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.&lt;ThrowAsync&gt;b__1(Object state)
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()</ExceptionString></Exception></TraceRecord>
这让我觉得我在 MCV 服务中使用 async
可能我扮演了一个角色,但也许它只是一个无辜的中间人。请帮我尝试确定为什么异常甚至没有传播到客户端。
async
方法中的异常存储在 returned 任务中。 async void
方法不 return 任务,因此在 ThreadPool
线程上抛出异常以拆除 AppDomain
.
不要在事件处理程序以外的任何地方使用async void
。
如果您 return 一个任务,您可以 await
该任务和异常将被重新抛出。