2010-02-17 13 views
10

स्ट्रीम किए गए एमटीओएम अनुरोधों को संभालने के दौरान डब्ल्यूसीएफ सामग्री-आईडी यूरी संदर्भों के लिए http://tempuri/1/number का उपयोग करता है।डब्ल्यूसीएफ: (एमटीओएम) xop में उपयोग की जाने वाली योजना को बदलने का कोई तरीका है: डब्ल्यूसीएफ द्वारा उत्पन्न सामग्री संदर्भ यूआरआईएस?

क्या डब्ल्यूसीएफ को एक्सओपी के लिए एक अलग सामग्री-आईडी संदर्भों का उपयोग करने के लिए मजबूर करने का कोई तरीका है: शामिल करें? समस्या का

पृष्ठभूमि:

मैं हैंडल जो बड़े डेटा अपलोड स्ट्रीम किया MTOM सक्षम jax ws जावा वेब सेवा के लिए एक .NET ग्राहक का निर्माण कर रहा हूँ। मैंने हाथ और सेवा संपर्कों को तैयार किया है (डब्लूएसडीएल जेनरेट किए गए अनुबंध सही नहीं थे और स्ट्रीमिंग की अनुमति नहीं दी गई थी)।

समस्या यह है कि वेब सेवा (जैक्स डब्ल्यूएस) को डेटा युक्त अनुरोध निकाय प्राप्त नहीं होता है।

यह हेडर में स्थानांतरित डेटा प्राप्त करता है।

हमने ws के लिए एक जावा क्लाइंट बनाया है - यह एक काम करता है।

मैं पर कब्जा कर लिया और HTTP यातायात की तुलना में जब जावा और WCF से अनुरोध पत्र जारी करने की है, और फर्क सिर्फ इतना है कि कन्टैंट आईडी संदर्भ उत्पन्न होती है जब बहुखण्डीय डेटा पोस्टिंग में है:

  • WCF http://tempuri/1/... सामग्री का उपयोग करता है -ID संदर्भ जो एन्कोडेड मूल्य में उत्पन्न करते हैं, जैसे href="cid:http%3A%2F%2Ftempuri.org%2F1%2F634019957020047928"

  • जावा ग्राहक, "ईमेल शैली" यूआरआई का उपयोग करता href="cid:[email protected]"

की तरह 63,210

में ये उपज निम्नलिखित पर बाद में XOP-भी शामिल है (डाटा साबुन शरीर में एकमात्र ऐसा तत्व है) (XOP includes specification)


//WCF: 
<Data> 
    <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:http%3A%2F%2Ftempuri.org%2F1%2F634019957020047928" /> 
</Data> 

//JAVA: 
<Data> 
    <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:[email protected]"/> 
</Data> 

, बहुखण्डीय डेटा में, सामग्री unencoded से जाना जाता है सामग्री-ID:

--uuid:7e166bb7-042f-4ba3-b6ef-98fbbc21244b+id=1 
Content-ID: <http://tempuri.org/1/634019957020047928> 
Content-Transfer-Encoding: binary 
Content-Type: application/octet-stream 

मुझे लगता है कि वहाँ jax वेब सेवा ढांचे में एक बग हो सकता है और यह WCF-उत्पन्न + urlencoded सामग्री-आईडी uri संदर्भ पहचान नहीं कर रहा।

क्या डब्ल्यूसीएफ को एक्सओपी के लिए एक अलग सामग्री-आईडी संदर्भों का उपयोग करने के लिए मजबूर करने का कोई तरीका है: शामिल करें?


संपादित करें: मैं XmlMtomWriter जो GenerateUriForMimePart विधि है पाया है, इस सामग्री-आईडी जेनरेट करने के लिए प्रयोग किया जाता है।

public static string GenerateUriForMimePart(int index) 
{ 
    return string.Format(CultureInfo.InvariantCulture, 
"http://tempuri.org/{0}/{1}", new object[] { index, DateTime.Now.Ticks }); 
} 

ऐसा प्रतीत नहीं होता कि आईडी पीढ़ी किसी भी तरह से अतिसंवेदनशील है।

ऐसा ही एक मुद्दा यहाँ वर्णित है, बशर्ते जवाब में मदद नहीं करता है: http://social.msdn.microsoft.com/Forums/en/wcf/thread/f90affbd-f431-4602-a81d-cc66c049e351

उत्तर

1

लंबे जांच के बाद अपने आप को Asnwering: संभव नहीं पूरे XmlMtomWriter और अन्य संबंधित परतों और WCF में चिंताओं reimplementing बिना - लगभग सब कुछ में शामिल एमटीओएम कार्यान्वयन आंतरिक है।

0

दोनों एक्सओपी में नमूने शामिल हैं जो आपने संकेत दिया है डब्ल्यू 3 सी के अनुसार सही और स्वीकार्य हैं। मैं उन्हें क्रमशः यूआरएल प्रारूप और ईमेल प्रारूप के रूप में संदर्भित करता हूं।

मैं जावा डेवलपर नहीं हूं, लेकिन किसी विशेष जावा वेब सेवा के साथ इंटरफेसिंग करते समय एक समान समस्या को याद करता हूं। मुझे याद है कि एक विशेष जावा रिलीज में एक बग होने के बाद और वे (जावा डेवलपर्स) अगले रिलीज संस्करण में अपग्रेड किए जाने के बाद, यह मुद्दा बस चला गया। काश मैं आपको अधिक जानकारी प्रदान कर सकता हूं, लेकिन उस समय, मेरे तार के अंत से मुझे संबोधित करने के लिए पर्याप्त समस्याएं थीं और मुझे दोषपूर्ण लॉग पर एक कम आइटम होने में खुशी हुई।

//WCF: using URL format 
<Data> 
    <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:http%3A%2F%2Ftempuri.org%2F1%2F634019957020047928" /> 
</Data> 

//JAVA: using EMAIL format 
<Data> 
    <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:[email protected]"/> 
</Data> 
1

मुझे पता है कि यह एक पुराना सवाल है। लेकिन मुझे दो दिन पहले एक ही समस्या का सामना करना पड़ा।

मुझे एक ऐसा तरीका मिला जो काम करता है लेकिन यह एक बहुत ही गंदा हैक (मुझे पता है। मैंने इसे यहां प्रकाशित नहीं करने के बारे में सोचा था, लेकिन शायद यह किसी की मदद करेगा।) उम्मीद है कि आप मुझे इसके लिए दोष नहीं देंगे।

सामग्री आईडी को CultureInfo.InvariantCulture के उपयोग से स्वरूपित किया गया है। मुझे कस्टम संस्कृतिइन्फो के साथ बदलने के लिए आधिकारिक तरीका नहीं मिला। लेकिन प्रतिबिंब की मदद से मुझे यह चल रहा है। निम्नलिखित कार्यान्वयन केवल नेट 4.0 के लिए है।

public class NoTempUriInvariantCultureInfo : CultureInfo, ICustomFormatter 
{ 
    private static CultureInfo originalCulture; 
    private static object originalCultureLock; 
    private static int enableCounter; 

    private NoTempUriInvariantCultureInfo(CultureInfo invariantCulture) 
     : base(invariantCulture.Name) 
    { 
     originalCulture = invariantCulture; 
    } 

    public static void Enable() 
    { 
     if(originalCultureLock == null) 
     originalCultureLock = new object(); 

     lock (originalCultureLock) 
     { 
     if (enableCounter == 0) 
     { 
      var mInvCultField = typeof (CultureInfo).GetField("s_InvariantCultureInfo", BindingFlags.NonPublic | BindingFlags.Static); 
      mInvCultField.SetValue(null, new NoTempUriInvariantCultureInfo(CultureInfo.InvariantCulture)); 
     } 
     enableCounter++; 
     } 
    } 

    public static void Disable() 
    { 
     lock (originalCulture) 
     { 
     if (enableCounter == 0) 
      return; 

     enableCounter--; 
     if (enableCounter == 0) 
     { 
      var mInvCultField = typeof (CultureInfo).GetField("s_InvariantCultureInfo", BindingFlags.NonPublic | BindingFlags.Static); 
      mInvCultField.SetValue(null, NoTempUriInvariantCultureInfo.originalCulture); 
     } 
     } 
    } 

    public override object GetFormat(Type formatType) 
    { 
     var result = originalCulture.GetFormat(formatType); 
     return result ?? this; 
    } 

    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
     if (format == null) 
     return System.Text.RegularExpressions.Regex.Replace(arg.ToString().Replace("http%3A%2F%2Ftempuri.org%2F1%2F", ""), "http[:][/][/]tempuri[.]org[/][0-9]+[/]*", ""); 
     return String.Format("{0:" + format + "}", arg); 
    } 
} 

मैं डब्लूसीएफ कॉल से पहले अपनी खुद की "InvariantCulture" को सक्षम करता हूं।

NoTempUriInvariantCultureInfo.Enable(); 
try 
{ 
    // make your call 
} 
finally 
{ 
    NoTempUriInvariantCultureInfo.Disable(); 
} 

CultureInfo.InvariantCulture एक वैश्विक राज्य वस्तु है। अपने स्वयं के InvariantCulture को सक्षम करने से हर दूसरे धागे को प्रभावित करता है। फिर, यह एक गंदे हैक है। लेकिन यह काम करता है।

+0

हाँ, यह गंदा है, लेकिन काम करने वाले समाधान को खोजने पर बधाई। मैंने प्रतिबिंब के माध्यम से InvariantCulture को बदलने के बारे में सोचा नहीं होगा, लेकिन ऐसा लगता है कि यह वास्तव में एकमात्र विकल्प है। – Marek