Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF建议返回故障消息的模式_C#_.net_Vb.net_Wcf_Response - Fatal编程技术网

C# WCF建议返回故障消息的模式

C# WCF建议返回故障消息的模式,c#,.net,vb.net,wcf,response,C#,.net,Vb.net,Wcf,Response,我正在编写一个WCF服务,想知道是否有一个推荐的模式用于从服务方法返回各种消息 例如,如果我在我的服务中调用公共用户登录(字符串用户名、字符串密码)方法,我希望它在它们是有效用户时返回我的用户对象。但是,如果详细信息不正确,或者帐户被禁用,我希望能够将该数据返回到客户端 我最初认为,当这两种情况之一发生时,我会抛出一个LogonFailureException(自定义异常类)。在客户机中,我可以捕获这种类型,并根据需要对其进行处理。但是,如果我正在调试应用程序,当抛出异常时,它会中断(即使我将其

我正在编写一个WCF服务,想知道是否有一个推荐的模式用于从服务方法返回各种消息

例如,如果我在我的服务中调用
公共用户登录(字符串用户名、字符串密码)
方法,我希望它在它们是有效用户时返回我的用户对象。但是,如果详细信息不正确,或者帐户被禁用,我希望能够将该数据返回到客户端

我最初认为,当这两种情况之一发生时,我会抛出一个
LogonFailureException
(自定义异常类)。在客户机中,我可以捕获这种类型,并根据需要对其进行处理。但是,如果我正在调试应用程序,当抛出异常时,它会中断(即使我将其包装为FaultException)

我还可以创建一个
ServiceResponse
类,我的所有方法都将其用作返回类型——在该类中,我可以有一个“Messages”集合,但这可能会违反直觉。我宁愿我的方法的返回类型只是我期望在正常情况下得到的返回类型

那么,归根结底,是否有一种处理从推荐的服务方法返回的消息的特定模式

谢谢

您需要抛出一个:

[DataContract]
公共类连接错误
{
[数据成员]
公共字符串问题{get;set;}
[数据成员]
公共字符串详细信息{get;set;}
}
[故障合同(类型(连接故障))]
[FaultContract(类型为(DataReaderFault))]
[经营合同]
Int16 GetInStock(intproductid);
//何时抛出异常
var connectionFault=新的connectionFault();
connectionFault.Issue=“连接到数据库时出现问题”;
connectionFault.Details=例如消息;
抛出新的FaultException(connectionFault);

然后客户可以捕捉到它。

在我看来,有两种情况。
1.您希望在服务端抛出某种异常。
2.您希望返回一个类,该类包含服务中出错的错误数据

有什么区别?第一个就像yaron写的那样,抛出并捕获一个FaultException。
第二种方法就是返回一个对象,例如,如果您的服务出现问题,您总是返回ErrorData—这是一个数据协定,其中包含消息和异常堆栈作为字符串—您可以添加ErrorData.Update方法,并且每次在服务中捕获新异常时,都更新ErrorData消息。。这适用于长时间运行的调用,这些调用可能会捕获多个异常,但您不希望在第一个异常时中止


无论您选择哪一种,都不要从异常继承,我已经读到这是一种不好的做法,您不希望通过WCF序列化和传输基于异常的数据契约

我认为提供错误属性供您评估的
ServiceResponse
类没有任何错误。我们在工作中使用类似的系统,您是对的,它可以工作-但有时感觉它是围绕返回值的另一个抽象层,当可能有更好、更有效的方法时。我在我的方法中尝试过这样做:例如,我检查user IsEnabled属性,如果该值为false,则抛出一个新的
FaultException
,但在调试时,它会在那里崩溃,而不是落在客户端(客户端有一个寻找它的陷阱)可能是VS.w/o调试中的调试配置,您是否获得了预期的行为?
[DataContract]
public class ConnectionFault
{
  [DataMember]
  public string Issue { get; set; }
  [DataMember]
  public string Details { get; set; }
}


[FaultContract(typeof(ConnectionFault))]
[FaultContract(typeof(DataReaderFault))]
[OperationContract]
Int16 GetInStock(int productId);

//when it's time to throw the exception
var connectionFault = new ConnectionFault();
connectionFault.Issue = "Problem connecting to the database";
connectionFault.Details = ex.Message;
throw new FaultException<ConnectionFault>(connectionFault);