我正在编写WCF服务,并且正在使用Fault
处理默认的IErrorHandler.ProvideFault
实现:
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
log.Error("ProvideFault called. Converting Exception to AdministrationFault....");
var defaultFault = new FaultException<AdministrationFault>(
new DefaultFault { Reason = error.Message }, error.Message);
fault = Message.CreateMessage(version,
defaultFault.CreateMessageFault(),
DEFAULT_FAULT_ACTION);
}
您看到的常量DEFAULT_FAULT_ACTION
需要与我的服务的FaultContractAttribute
具有相同的值。鉴于我的服务是在界面中定义的:
[ServiceContract(Namespace = "http://example.com/service/IFooService")]
public interface IFooService
{
[OperationContract]
[FaultContract(typeof(DefaultFault),
Action = "http://example.com/service/IFooService/fault/DefaultFault")]
void AddUser(UserInfo userInfo, string password);
}
我无法创建const
变量来存储命名空间/操作值。所以现在我被迫创建一个类来存储常量:
public class StupidHackyConstClass {
public const string NAMESPACE = "http://exampl.com/service/IFooService";
public const string DEFAULT_FAULT_ACTION = NAMESPACE + "/fault/DefaultFault"
}
这样我就可以重构接口属性和错误处理程序实现以使用公共值。我知道一个关于consts的类是一个可怕的反模式,但似乎我在这里有一个漏洞......有什么建议吗?