gpt4 book ai didi

WCF 异常处理 #2

转载 作者:行者123 更新时间:2023-12-04 22:11:21 24 4
gpt4 key购买 nike

我有 N 个 WCF 服务方法。我想实现异常处理。我的服务将被 .net 和非 .net 客户端使用。故障契约是实现异常处理的唯一方法吗?如果这意味着我如何避免实现我的服务中的所有方法。我如何在一个地方实现异常处理来处理我的服务中所有方法的异常。请提供一些代码集以轻松稳定。

这是我的示例代码。

我的故障契约(Contract)

[DataContract()]  
public class FleetCustomException
{
[DataMember()]
public string Title;
[DataMember()]
public string ExceptionMessage;
[DataMember()]
public string InnerException;
[DataMember()]
public string StackTrace;
}

我的服务契约(Contract)
[ServiceContract]  
public interface IAddress
{
[OperationContract]
[FaultContract(typeof(FleetCustomException))]
bool SaveAddress(string address1, string address2, string address3, string city, string province, string postalCode,string country,bool isDeleted, int createdBy, DateTime createdDate, int lastModifiedBy, DateTime lastModifiedDate);

[OperationContract]
[FaultContract(typeof(FleetCustomException))]
bool DeleteAddress(Int64 addressID, int lastModifiedBy);

[OperationContract]
[FaultContract(typeof(FleetCustomException))]
List<Address> GetAllAddresses();
}

服务
public class SettingsService : IAddress  
{

#region IAddress Members

public bool SaveAddress(string address1, string address2, string address3, string city, string province,string postalCode,string country, bool isDeleted,int createdBy, DateTime createdDate, int lastModifiedBy, DateTime lastModifiedDate)
{
try
{
Address address = new Address(0, address1, address2, address3, city, province, postalCode, country, isDeleted,createdBy, createdDate, lastModifiedBy, lastModifiedDate);
return address.Insert();

}
catch (FaultException ex)
{

FleetCustomException ex = new FleetCustomException();
ex.Title = "Error Funtion:SaveAddress()";
ex.ExceptionMessage = "Error occur while doing save address function.";
ex.InnerException = "Inner exception message from serice";
ex.StackTrace = "Stack Trace message from service.";
throw new FaultException(ex,"Reason: Testing the Fault contract") ;
}
}




public bool DeleteAddress(Int64 addressID, int lastModifiedBy)
{
Address address = new Address(addressID, lastModifiedBy);
return address.Delete();
}

public List<Address> GetAllAddresses()
{

Address address = new Address();
return address.GetAllAddresses();
}
#endregion

}

服务层中的配置 includeExceptionDetailInFaults="true"in <serviceDebug>
<serviceDebug includeExceptionDetailInFaults="true"/>  

消费方式
   try  
{
MySettingsService.SettingsService proxy = new MySettingsService.SettingsService();
proxy .SaveAddress(Address1TextBox.Text, Address2TextBox.Text, "", "", "", "641025", "", false, 1, DateTime.Now, 0, DateTime.Now);
}
catch (FaultException<MyCalculatorService.CustomException> ex)
{
//Process the Exception
}

我必须对我的所有服务方法实现我有超过 100 种方法有什么方法可以快速有效地实现它

最佳答案

FaultContract 是处理错误的适当“SOAP”方式。 SOAP 标准定义了故障消息元素。

WCF 的缺点是您需要指定 [FaultContract]在每个 WCF 服务操作上,所以如果你有很多方法,你必须在很多地方定义它。
(实际上有一种方法可以在 WCF 服务启动时以编程方式添加故障契约(Contract),以防止必须在每个方法上声明它,如果我可以在某处挖掘代码......)

此外,如果您希望某个中心位置来处理 WCF 服务中的错误,您可以实现 IErrorHandler当发生任何未处理的异常时,它将被 WCF 调用。

或者,您可以仅以这样一种方式构建您的消息,即它们始终可以选择包含错误消息。例如:

[OperationContract]
SaveAddressResult SaveAddress(...);

[DataContract]
public class SaveAddressResult : Result
{
[DataMember]
public bool Success { get; set; }
}

[DataContract]
public class Result
{
[DataMember]
public string ErrorMessage { get; set; }
}

附加说明:将异常和堆栈跟踪发送回客户端是不好的做法!它可能包含堆栈跟踪信息或您的客户不应该知道的其他信息。例如,如果您有一个服务方法尝试使用 SQL 查询验证登录,而 DB 本身导致了异常,则客户端可能会在查询抛出的异常消息中取回您的表和列名,甚至是数据库名称.您的异常消息应始终进行清理,并精简为客户需要的信息!

一个很好的例子是进入数据库的任何字符串输入。做类似的事情:
public Save(string someData)
{
sqlCommand.Statement = "insert into myTable (myColumn) values (" + someData + ")";
sqlCommand.Execute();
}

如果插入的列是 VARCHAR(256)并且用户现在向您的服务发送一个 500 个字符的字符串,客户端将返回一条故障消息,其中包括“对于列 myTable.myColumn 的值太大”之类的内容。那是您的客户永远不应该知道的实现和内部细节。

关于WCF 异常处理 #2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8715249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com