2009-09-08 24 views
13

उदाहरण के लिए प्रत्येक सेवा पर 10 सेवाओं और 20 विधियों के साथ एक परियोजना लें।डब्ल्यूसीएफ: कई विधियों पर समान Faultcontract

सभी सेवाएं बेस सेवाओं से प्राप्त होती हैं जिनमें सुरक्षा जांच होती है। सुरक्षा विधि में कॉल करने के लिए प्रत्येक विधि की पहली बात यह है कि। यदि कोई समस्या है तो यह सुरक्षा अपवाद फेंकता है।

प्रश्न है: क्या मुझे प्रत्येक विधि (ऑपरेशन कंट्रैक्ट) पर फ़ॉल्टकंट्रैक्ट निर्दिष्ट करने की आवश्यकता है, या क्या मैं इसे केंद्रीय परिभाषा में एक बार कर सकता हूं?

उत्तर

6

नहीं पर, आप प्रत्येक और हर पद्धति पर यह करने के लिए की जरूरत है - WCF बल्कि picky है और स्पष्ट सेटिंग्स सब कुछ के लिए काफी है (जो वास्तव में अंत में एक अच्छी बात है की आवश्यकता है, मैं आश्वस्त हूँ)।

मार्क

+0

निश्चित रूप से आप सहमत होंगे कि एक ऑर्थोगोनल तरीके से सुरक्षा जैसे क्रॉस-कटिंग चिंताओं को लागू करना संभव होना चाहिए। यह मेरे लिए अजीब लगता है कि मैं एक अच्छा 'सेवा प्राधिकरण प्रबंधक' को एक निर्णायक तरीके से कार्यान्वित कर सकता हूं, लेकिन फिर मुझे एक कस्टम सुरक्षा गलती फेंकना है, तो मुझे अपने अनुबंधों को दोहराव वाले जंक के साथ छिड़कना होगा। –

+0

मैं सहमत हूं, मैं भी दोहराव वाले जंक को स्वचालित रूप से करने के लिए एक विधि की तलाश में हूं। – joelsand

+0

आप अपने सभी अनुबंधों को एक एक्सएमएल (या अन्य) फ़ाइल से उत्पन्न करने के लिए कुछ टी 4 लिख सकते हैं और वैश्विक दोषों को परिभाषित करने के लिए अपना कस्टम तर्क प्राप्त कर सकते हैं। कोडप्लेक्स पर [WSSF] (http://servicefactory.codeplex.com/) प्रोजेक्ट भी है जो आपके अनुबंधों के लिए एक डिज़ाइनर का उपयोग करता है और क्लाइंट/सर्वर कोड उत्पन्न करता है (यह एक बहुत भारी टूल है)। – SandRock

0

हाँ प्रत्येक ऑपरेशन अनुबंध

30

आप कस्टम विशेषता बनाकर ऐसा कर सकते हैं।

आईसीओन्ट्रैक्ट व्यवहार को लागू करें और मान्य विधि पर प्रत्येक ऑपरेशन में गलती जोड़ें।

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; 
    } 
} 
+0

+1 धन्यवाद, मैं इसे हमारी अगली परियोजना –

+0

+1 पर आज़माउंगा, इससे मदद मिलती है। इंटरफ़ेस में प्रत्येक व्यक्तिगत विधि के बजाय, इस तरह 1 विशेषता ServiceContract इंटरफ़ेस स्तर पर लागू की जा सकती है। – CodingWithSpike

+1

इसे उत्तर के रूप में चिह्नित किया जाना चाहिए। –