以每個服務中包含10個服務和20個方法的項目爲例。WCF:在許多方法上都有同樣的錯誤合同
所有服務都從具有安全檢查的基本服務繼承。每種方法做的第一件事就是打電話給安全檢查。如果出現問題,會引發安全異常。
問題是:我需要在每個方法(OperationContract)上指定一個FaultContract,還是我可以在中心定義中執行一次?
以每個服務中包含10個服務和20個方法的項目爲例。WCF:在許多方法上都有同樣的錯誤合同
所有服務都從具有安全檢查的基本服務繼承。每種方法做的第一件事就是打電話給安全檢查。如果出現問題,會引發安全異常。
問題是:我需要在每個方法(OperationContract)上指定一個FaultContract,還是我可以在中心定義中執行一次?
不上,你需要做的是對每一個方法 - WCF是相當挑剔,需要明確的設置幾乎一切(這真的是到底是一件好事,我我深信)。
Marc
是每個經營合同
你可以通過創建一個自定義屬性來實現。
實現IContractBehavior並將錯誤添加到Validate方法的每個操作。
void IContractBehavior.Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
foreach (OperationDescription od in contractDescription.Operations)
od.Add(yourFault);
}
這裏的a link詳細說明如何實現這一點。低於實際使用的代碼:
[AttributeUsage(AttributeTargets.Interface, AllowMultiple = false, Inherited = true)]
public class StandardFaultsAttribute : Attribute, IContractBehavior
{
// this is a list of our standard fault detail classes.
static Type[] Faults = new Type[]
{
typeof(AuthFailure),
typeof(UnexpectedException),
typeof(UserFriendlyError)
};
public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
}
public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
foreach (OperationDescription op in contractDescription.Operations)
{
foreach (Type fault in Faults)
{
op.Faults.Add(MakeFault(fault));
}
}
}
private FaultDescription MakeFault(Type detailType)
{
string action = detailType.Name;
DescriptionAttribute description = (DescriptionAttribute) Attribute.GetCustomAttribute(detailType, typeof(DescriptionAttribute));
if (description != null)
action = description.Description;
FaultDescription fd = new FaultDescription(action);
fd.DetailType = detailType;
fd.Name = detailType.Name;
return fd;
}
}
+1謝謝,我會在我們的下一個項目 – 2010-12-02 08:00:15
+1上試用這個幫助。這種方式1屬性可以應用在ServiceContract接口級別,而不是接口中的每個單獨的方法。 – CodingWithSpike 2011-01-31 14:38:45
這應該被標記爲答案。 – 2015-03-26 13:16:53
當然,您會同意以正交的方式實施交叉擔憂,如安全性。對我來說,我可以以一種分離的方式實現一個很好的'ServiceAuthorizationManager'似乎很奇怪,但是如果我想拋出一個定製的安全錯誤,那麼我必須將我的合同用重複的垃圾進行分配。 – 2010-04-28 12:42:05
我同意,我正在尋找一種自動執行重複性垃圾的方法。 – joelsand 2010-05-07 15:24:58
您可以編寫一些T4來從XML(或其他)文件生成所有合同,並使用您的自定義邏輯來定義全局錯誤。在codeplex上還有一個[WSSF](http://servicefactory.codeplex.com/)項目,它爲您的合約使用設計器並生成客戶端/服務器代碼(這是一個相當繁重的工具)。 – SandRock 2012-11-06 14:58:46