2013-08-05 10 views
6

मैंने निजी कतार पर संदेश भेजने के लिए अनुमतियों को अचयनित किया है, फिर भी MessageQueue.CanWritefalse कभी नहीं लौटाता है। मैं टॉगल संदेश अनुमतियां प्राप्त कर सकता हूं और CanRead संपत्ति अपेक्षित के रूप में प्रतिक्रिया दे सकता है। CanWrite संपत्ति अलग-अलग व्यवहार क्यों करेगी?MessageQueue.CanWrite हमेशा सत्य लौटाता है

मैंने इस मुद्दे का परीक्षण दो अलग-अलग एडी उपयोगकर्ताओं के साथ किया है और परिणाम समान हैं।

क्या यह सत्यापित करने के लिए कोई अलग दृष्टिकोण है कि कोई विशिष्ट उपयोगकर्ता खाता एक विशिष्ट रिमोट निजी कतार में एक मेसेज भेज सकता है या नहीं?

public class SendBehavior : IMsmqRuleBehavior 
{ 
    public bool Validate(string queuePath) 
    { 
     using (var queue = new MessageQueue(queuePath, QueueAccessMode.Send)) 
     { 
      return queue.CanWrite;           
     } 
    } 
} 

public class ReceiveBehavior : IMsmqRuleBehavior 
{ 
    public bool Validate(string queuePath) 
    { 
     using (var queue = new MessageQueue(queuePath, QueueAccessMode.Receive)) 
     { 
      return queue.CanRead;     
     } 
    } 
} 
+0

ऐसा लगता है कि यदि 'QueueAccessMode.Send' से अनुरोध किया गया है कि' CanWrite' संभवतः 'सत्य' होगा।* (साइड प्रश्न: क्या आपने इस कतार के लिए 'प्रमाणीकृत' चेक बॉक्स टॉगल किया था) * – user7116

+0

मैंने सोचा था कि डिफ़ॉल्ट QueueAccessMode SendAndReceive है और CanRead परीक्षण प्राप्त करने के लिए QueueAccessMode सेट के साथ अपेक्षित व्यवहार करता है। – chad

+0

क्या आप 'QueueAccessMode.Receive' सेट करते समय' CanWrite' 'false' बन जाते हैं? क्योंकि आईएलएसपी में 'MessageQueue' वर्ग की मेरी समीक्षा से ऐसा लगता है कि केवल आपके द्वारा दिए गए आपके मोड उन संपत्ति मानों को प्रतिबिंबित करते हैं। – user7116

उत्तर

3

मैं क्या बता सकते हैं, इस व्यवहार MessageQueue.CanWrite लिए करना के रूप में है। आप MessageQueue वर्ग की हिम्मत में काफी गहरा गड्ढा, तो आप इसे कुछ सहायता तत्व जो निम्नलिखित तरीके से इस संपत्ति के मूल्य को प्रभावित बनाता है मिल जाएगा:

  1. आप QueueAccessMode.Send (या SendAndReceive) पार कर लेते हैं, एक आंतरिक एक्सेस मोड सहायक बनाया जाएगा जो true देता है यदि (this.accessMode & QueueAccessMode.Send) != (QueueAccessMode)0

  2. यदि # 1 true है, तो यह एक्सेस मोड का उपयोग करके और अनुरोध किए गए साझाकरण का उपयोग करके इसे कैश में स्टोर करने के लिए कतार को खोलने का प्रयास करता है। अनुरोध किया मोड में कतार खोलने के लिए अधिकारों का उपयोग बुला आवेदन के लिए अनुमति नहीं है, तो

    : इस बिंदु देशी विधि MQOpenQueue को फोन किया जाता है, जो (जोर मेरा) अपनी टिप्पणी में निम्नलिखित है पर है, तो निम्न दो बातें होती हैं कर सकते हैं: dwAccessMQ_SEND_ACCESS पर सेट है

    • हैं, तो MQOpenQueue सफल होगा, लेकिन त्रुटियों जब आवेदन संदेश भेजने का प्रयास करता लौटा दी जाएगी।
    • dwAccessMQ_PEEK_ACCESS या MQ_RECEIVE_ACCESS पर सेट है, MQOpenQueue असफल और वापसी MQ_ERROR_ACCESS_DENIED (0xC00E0025) होगा। इस मामले में एक कतार संभाल phQueue पर वापस नहीं किया जाता है।

इसलिए, दिए गए एक QueueAccessMode.Send (या SendAndReceive) एक वैध कतार नाम और साझा करने के मोड के साथ, यह मेरी समझ है कि CanWritetrue वापस आ जाएगी, तो आप वास्तव में एक भेजने के लिए पहुँच नहीं है, भले ही संदेश।

मूल रूप से ऐसा लगता है कि आप केवल CanWrite == false प्राप्त यदि और केवल यदि देगा:

  1. आप एक QueueAccessMode जो Send या SendAndReceive नहीं है गुजरती हैं।
+0

इसमें खोदने के लिए धन्यवाद। कतार पर प्राप्त संदेश अनुमतियों को "कैनराइड" संपत्ति के सही/झूठे टॉगल में क्यों प्राप्त करना होगा और जब मैं कतार में संदेश भेजता हूं, तो अक्षम संदेश के साथ, संदेश इसे कतार में कभी नहीं बनाता है लेकिन मैं नहीं हूं एक अपवाद प्राप्त करना। यह मेरे लिए अजीब लगता है। मुझे लगता है कि CanRead और CanWrite एक ही तरीके से व्यवहार करेंगे। – chad

+0

@ चाडलाज़ेट: काश मैं आपके लिए एक बेहतर जवाब था, लेकिन जो मैं देख सकता हूं उससे यह व्यवहार दूसरे छोर पर कतार की वास्तविक अनुमतियों पर आधारित नहीं है। – user7116

+0

पर्याप्त मेला। मैं इसकी सराहना करता हूं। मुझे यह सत्यापित करने के लिए एक और तरीका आना होगा कि कोई उपयोगकर्ता संदेश भेज सकता है या नहीं। – chad

संबंधित मुद्दे