C# WCF和错误处理,最佳实践

C# WCF和错误处理,最佳实践,c#,asp.net,.net,wcf,web-services,C#,Asp.net,.net,Wcf,Web Services,我有一个理论问题。我有一个WCF web服务,需要与.NET客户端和iPhone应用程序进行对话 在服务中,我有许多方法,如: User Login(string email,string password); etc.. 如果成功,我希望服务将用户返回给我。否则,我希望服务向我抛出一个自定义异常,例如EmailNotFoundException或PasswordNotCorrectException 我被告知这不是最好的方式,特别是因为iPhone客户端将使用这项服务 我是否应该更改所有方法

我有一个理论问题。我有一个WCF web服务,需要与.NET客户端和iPhone应用程序进行对话

在服务中,我有许多方法,如:

User Login(string email,string password); etc..
如果成功,我希望服务将用户返回给我。否则,我希望服务向我抛出一个自定义异常,例如
EmailNotFoundException
PasswordNotCorrectException

我被告知这不是最好的方式,特别是因为iPhone客户端将使用这项服务

我是否应该更改所有方法以返回一些将包含
对象
和错误字符串/异常对象的
包装器实体


这对我来说很重要,因为有时我需要知道操作失败的原因。如果
Login
返回null,我将知道操作失败,但我不知道原因。

您不应该在WCF服务中使用异常来定期与服务的使用者通信。相反,请查看如何创建一个响应对象,该对象包含您需要了解的有关该操作的所有信息

比如:

public class LoginResponse
{
    public User User { get; set; }
    public string Message { get; set; }
    public bool IsSuccessful
    {
        get { return User != null; }
    }
}
LoginResponse Login(string email, string password)
{ ... }
然后,您的登录操作将类似于:

public class LoginResponse
{
    public User User { get; set; }
    public string Message { get; set; }
    public bool IsSuccessful
    {
        get { return User != null; }
    }
}
LoginResponse Login(string email, string password)
{ ... }
这样,如果操作失败,您可以在响应中添加一条消息来解释原因。

是WCF错误处理的“正确”方式,但可能不适合您的情况。
您可以使用erros的cods或某种类型的错误类实例作为响应字段,如果成功,响应字段为null…

您可以使用常规的Try-Catch异常或RaiseExceptions作为null异常,如果您不确定并且不想假设调用/方法总是会通过,您可以将它们包装在Try-Catch周围。。经验法则是用Try-catch或Try-catch-finally包装所有内容