WCF:多くの方法で同じ障害契約
-
21-09-2019 - |
質問
たとえば、各サービスに10のサービスと20のメソッドを備えたプロジェクトをご覧ください。
すべてのサービスは、セキュリティチェックがあるベースサービスから継承されます。各方法が最初に行うことは、セキュリティチェックに電話をかけることです。これにより、問題がある場合はセキュリティ例外がスローされます。
質問:各メソッド(OperationContract)に障害を指定する必要がありますか、それとも中央の定義で一度行うことはできますか?
解決
いいえ、すべての方法でそれを行う必要があります-WCFはかなりうるさいことであり、すべてにかなりの明示的な設定が必要です(これは本当に良いことです、私は確信しています)。
マーク
他のヒント
カスタム属性を作成することでそれを行うことができます。
icontractbehaviorを実装し、検証メソッドの各操作に障害を追加します。
void IContractBehavior.Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
foreach (OperationDescription od in contractDescription.Operations)
od.Add(yourFault);
}
これがそうです リンク これは、これを達成する方法を詳述しています。使用する実際のコードの下:
[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;
}
}
はい、各操作契約で
所属していません StackOverflow