我在WP8环境中有一个WCF请求,我根据这个包装了 http://msdn.microsoft.com/en-us/library/hh873178%28v=vs.110%29.aspx#EAP
我对WCF服务的调用如下:
try
{
var result = await mWCFClient.PerformRequestAsync();
}
catch(Exception e)
{
}
其中PerformRequestAsync是一种扩展方法。即。
public static ResultType PerformRequestAsync(this WCFClient client)
{
// EAP wrapper code
}
在WCF服务上偶尔出现问题并返回“NotFound”会发生什么。我不是百分之百确定为什么会发生这种情况,这似乎是一个罕见的场合。但问题不是WCF服务行为,而是它在自动生成的WCF代码中的EndPerformRequestAsync()中断而不是转到我的异常处理程序。
我应该如何以及在何处捕获此异常,因为它永远不会到达我的预期处理程序?!
[编辑]
根据Stephen的要求,我在这里包含了包装代码:
public static Task<RegistrationResult> RegisterAsync(this StoreServiceReference.StoreServiceClient client, string token, bool dummy)
{
var tcs = new TaskCompletionSource<RegistrationResult>();
EventHandler<RegisterCompletedEventArgs> handler = null;
handler = (_, e) =>
{
client.RegisterCompleted -= handler;
if (e.Error != null)
tcs.TrySetException(e.Error);
else if (e.Cancelled)
tcs.TrySetCanceled();
else
tcs.TrySetResult(e.Result);
};
client.RegisterCompleted += handler;
PerformStoreRequest(client, () => client.RegisterAsync(), token);
return tcs.Task;
}
private static void PerformStoreRequest(StoreServiceClient client, Action action, string token)
{
using (new OperationContextScope(client.InnerChannel))
{
HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
requestMessage.Headers[STORE_TOKEN_HTTP_HEADER] = token;
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
action.Invoke();
// TODO: Do we need to add handler here?
}
}
现在我看一下,我认为问题源于动作调用的本质。但是向WP8 WCF服务添加自定义标头已经很痛苦了
里面的动作是一个异步操作,但据我所知,Invoke不是。
什么是正确的方法在这里?