如何从远程WCF服务中捕获异常?

3
在从Visual Studio UI添加引用后,我初始化了客户端:
private WcfRequestProcessorClient _client;

var binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;

string serviceFullUrl = "http://myserviceurl.com/svcapi";
var address = new EndpointAddress(serviceFullUrl);

_client = new WcfRequestProcessorClient(binding, address);
_client.ClientCredentials.UserName.UserName = "MyUserName";
_client.ClientCredentials.UserName.Password = "MyPassword";

后来,我使用该请求作为参数调用相关方法:

try
{
    var itemsReq = LoadItemsRequest();
    _client.ProcessRequestsAsync(itemsReq);
}
catch(Exception)
{
     // source code for show an error in a popup
}

现在,当URL、用户名和密码正确时,一切正常。但是,如果URL、用户名或密码错误应用程序会崩溃,并且在调试时Visual Studio会显示此窗口,跳过我的catch块

enter image description here

有什么方法可以处理这些类型的异常吗?


你有服务代码吗? - Amit Kumar Ghosh
@AmitKumarGhosh,我没有服务代码。 我只想捕获异常以显示一些对话框。 这可能吗? - Fran_gg7
尝试像这样写:catch(Exception e){Console.WriteLine(e.Message);} - Amit Kumar Ghosh
尝试在你的方法上放置 [HandleProcessCorruptedStatesException] 属性。 - Amit Kumar Ghosh
@ScottChamberlain,该方法不可等待,它不返回任务(只是一个void)。我正在订阅由_client类提供的ProcessRequestsCompleted事件。 - Fran_gg7
显示剩余4条评论
2个回答

0
catch(Exception e)
    {
     MessageBox.Show(e.Message.ToString());
    }

希望这可以帮到你。 对于高级异常抛出,请参考WCF中的FaultException。它是专门为面向服务的架构设计的。

或者使用 e.InnerException。 - Utkarsh Bhushan
你好。我的问题是我没有捕获到异常。我已经尝试使用FaultException...在catch块中放置了一些断点,但调试器没有停止。我的目标是处理异常并避免应用程序自动崩溃和关闭。 - Fran_gg7
检查一下异常是否在你的try catch块之外被抛出,这可能是问题所在。 - Utkarsh Bhushan

0

该服务需要配置为向您传播真实的异常。

然而,即使您不知道实际原因,它也会声明是否已经抛出异常。 “已经抛出异常”

异常未被捕获的原因是调用是异步的。

即异常在与您调用的不同堆栈上抛出。

如果它返回一个任务,则需要等待它。

如果它是APM式的异步,则必须提供回调并尝试在那里捕获它。

此外,您还可以注册 AppDomain.UnhandledException以最终捕获此异常。


你好。这个方法无法等待(它只是一个void)。我必须订阅ProcessRequestsCompleted事件。那么...我该怎么做呢? - Fran_gg7
什么是ProcessRequestsCompleted?如果它是APM风格的调用,我建议您需要提供回调函数。我不记得如何做了。答案仍然是异步调用导致异常未被捕获的原因。 - eran otzap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接