سؤال

خذ على سبيل المثال مشروع مع 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;
    }
}

نعم في كل عقد عملية

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top