从包装的EAP请求中捕获到WCF的异常

时间:2014-04-30 10:37:32

标签: wcf windows-phone-8 asynchronous exception-handling

我在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不是。
什么是正确的方法在这里?

0 个答案:

没有答案