1

我目前正在为需要调用 WCF 服务应用程序的 WP7 开发应用程序。我用一个小型 WPF 应用程序测试了该服务,一切都很好。但是现在我从我的 WP7 应用程序中调用它,我系统地得到以下异常:

An exception of type 'System.ServiceModel.CommunicationException' occurred in
System.ServiceModel.ni.dll but was not handled in user code

System.ServiceModel.CommunicationException was unhandled by user code
    HResult=-2146233087
    Message=The remote server returned an error: NotFound.
    Source=System.ServiceModel
    InnerException: System.Net.WebException
        HResult=-2146233079
        Message=The remote server returned an error: NotFound.
        Source=System.Windows
        InnerException: System.Net.WebException
             HResult=-2146233079
             Message=The remote server returned an error: NotFound.
             Source=System.Windows
             InnerException: 

尽管我在这样的 try/catch 块中进行了服务调用(在 MyProjectPath.Model.User.cs 中),但异常仍然被解除:

public Task<User> Load(string logon, string pwHash)
{
    TaskCompletionSource<User> tcs = new TaskCompletionSource<User>();

    client.GetUserByCredsCompleted += ((s, e) =>
        {
            if (e.Error == null) tcs.TrySetResult(e.Result);
            else
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendLine("Error encountered while getting data :");
                sb.AppendLine(e.Error.Message);

                MessageBox.Show(sb.ToString());
            }
        });
    try
    {
        client.GetUserByCredsAsync(logon, pwHash);
    }
    catch (System.ServiceModel.CommunicationException ex)
    {
        MessageBox.Show(ex.Message);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    return tcs.Task;
}

并且在执行时,此处发生异常(在 System.ServiceModel.ni.dll 中):

public MyProjectPath.ServiceReference.User EndGetUserByCreds(System.IAsyncResult result) {
    object[] _args = new object[0];
        // Exception gets lifted by the following line :
    MyProjectPath.ServiceReference.User _result = ((MyProjectPath.ServiceReference.User)(base.EndInvoke("GetUserByCreds", _args, result)));
    return _result;
}

有没有人已经遇到过这个问题并解决了?我必须承认我在这里很无知...

4

1 回答 1

0

您正在调用异步 API。尽管您将该调用包装在 try/catch 块中,但该调用可能会启动一个新线程或排队请求另一个现有线程以获取。无论哪种方式,您的 try/catch 只会保护您免受在进行调用的线程上引发的异常的影响,并且没有任何异常。您的异步调用(开始)成功了,所以 catch 块永远不会生效,然后控制权被传递给另一个线程,这就是引发异常的地方。

您无法通过在 try/catch 中包装对 GetUserByCredsAsync 的调用来防止 EndGetUserByCreds 中的异常。这两种方法在不同的时间执行不同的线程。您需要修改 EndGetUserByCreds 以便它捕获异常并适当地处理它们,而不是让它们使线程崩溃。

于 2013-06-21T10:59:34.707 回答