2009-08-27 12 views
20

मैं संदेश अनुबंधों के साथ डब्ल्यूसीएफ स्ट्रीमिंग का उपयोग करने की कोशिश कर रहा हूं, क्योंकि मुझे स्ट्रीम के बगल में अतिरिक्त पैरामीटर की आवश्यकता है।डब्ल्यूसीएफ: संदेश संविदाओं के साथ स्ट्रीमिंग का उपयोग

मूल रूप से मैं शीर्ष पर कुछ अतिरिक्त तर्क के साथ एक फ़ाइल अपलोड और डाउनलोड सेवा बना रहा हूं। '/' आवेदन में

सर्वर त्रुटि:

दुर्भाग्य से, जब मुझे लगता है कि सब कुछ ठीक है की जाँच करने के ब्राउज़र से सेवा प्राप्त करने का प्रयास, मैं निम्नलिखित त्रुटि मिलती है। अनुबंध 'IFileTransferService' में ऑपरेशन 'अपलोडफाइल' एक संदेश नियंत्रण का उपयोग करता है जिसमें SOAP शीर्षलेख हैं। SOAP शीर्षलेख किसी भी संदेश संदेश द्वारा समर्थित नहीं हैं।

दुर्भाग्यवश इसके लिए गुगल करने से कोई महत्वपूर्ण परिणाम नहीं मिला जिसने मेरी मदद की। क्या आप लोग मेरी मदद कर सकते हैं? यहां सेवा के विवरण (मैंने अंतरिक्ष के कारण डाउनलोड हिस्से को हटा दिया है)।

<customBinding> 
    <binding name="customHttpBindingStream"> 
     <textMessageEncoding messageVersion="Soap12" /> 
     <httpTransport transferMode="Streamed" maxReceivedMessageSize="2147483647"/> 
    </binding> 
</customBinding> 

अद्यतन:

[ServiceContract(Namespace = "http://www.acme.org/2009/04")] 
public interface IFileTransferService 
{ 
    [OperationContract(Action = "UploadFile")] 
    void UploadFile(FileUploadMessage request); 
} 

[MessageContract] 
public class FileUploadMessage 
{ 
    [MessageHeader(MustUnderstand = true)] 
    public FileMetaData Metadata { get; set; } 

    [MessageBodyMember(Order = 1)] 
    public Stream FileByteStream { get; set; } 
} 

[DataContract(Namespace = "http://schemas.acme.org/2009/04")] 
public class FileMetaData 
{ 
    [DataMember(Name="FileType", Order=0, IsRequired=true)] 
    public FileTypeEnum fileType; 

    [DataMember(Name="localFilename", Order=1, IsRequired=false)] 
    public string localFileName; 

    [DataMember(Name = "remoteFilename", Order = 2, IsRequired = false)] 
    public string remoteFileName; 
} 

मैं दोनों basichttpbinding और एक customhttp नहीं सकारात्मक प्रभाव के साथ बंधन का उपयोग करने की कोशिश की है प्रलेखन ऑनलाइन पढ़ने ऐसा लगता है कि MessageContracts साथ स्ट्रीमिंग वास्तव में संभव हो जाना चाहिए। MSDN (Large Data and Streaming), उदाहरण के लिए देखें:

Programming Model for Streamed Transfers

The programming model for streaming is straightforward. For receiving streamed data, specify an operation contract that has a single Stream typed input parameter. For returning streamed data, return a Stream reference. [...] This rule similarly applies to message contracts. As shown in the following message contract, you can have only a single body member in your message contract that is a stream. If you want to communicate additional information with the stream, this information must be a carried in message headers. The message body is exclusively reserved for the stream content.

[MessageContract] 
public class UploadStreamMessage 
{ 
    [MessageHeader] 
    public string appRef; 
    [MessageBodyMember] 
    public Stream data; 
} 

मैं भी फाइल अपलोड की सेवाओं को पूरा करने के लोगों से ब्लॉग पोस्ट देखा है और बहुत मैं क्या एक साथ (उदाहरण के here के लिए) डाल करने के लिए कोशिश कर रहा हूँ के लिए इसी तरह डाउनलोड किया है।

अद्यतन 2 मैं एक छोटे से सांत्वना और स्वयं एक basicHttpBinding साथ होस्टिंग सेवा बनाने की कोशिश की है और वहाँ यह एक आकर्षण की तरह काम करता है। मुझे विश्वास है कि समस्या आईआईएस पर होस्टिंग हो सकती है। कोई उपाय?

अद्यतन 3 मेरा अपना उत्तर देखें।

+0

मेरा मानना ​​है कि 'MessageBodyMember' विशेषता में' ऑर्डर = 1' अनावश्यक है क्योंकि आपके पास केवल एक बॉडी तत्व –

उत्तर

8

मैं अंत में पता चला त्रुटि थी क्या:, आदि यह साबुन संस्करणों के साथ कोई संबंध नहीं था, धाराओं ... मैं बस अपना खुद का सेवा के नाम गलत वर्तनी के बजाय FileTransfer का उपयोग कर (!) FileTransferService

अंत में मूल एचटीपी बाइंडिंग पूरी तरह ठीक थी, मुझे कस्टम बाइंडिंग का सहारा लेने की आवश्यकता नहीं थी।

मूल (बुरा) संस्करण:

<service 
    behaviorConfiguration="serviceBehavior" 
    name="Acme.Service.FileTransfer"> 
    <endpoint address="" 
     name="basicHttpStream" 
     binding="basicHttpBinding" 
     bindingConfiguration="httpLargeMessageStream" 
     contract="Acme.Service.IFileTransferService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
</service> 

नई (निर्धारित) संस्करण:

<service 
    behaviorConfiguration="serviceBehavior" 
    name="Acme.Service.FileTransferService"> 
    <endpoint address="" 
     name="basicHttpStream" 
     binding="basicHttpBinding" 
     bindingConfiguration="httpLargeMessageStream" 
     contract="Acme.Service.IFileTransferService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
</service> 

फिर भी मैं नहीं कह सकता कि त्रुटि संदेश को समझने के लिए क्या हो रहा था किसी भी तरह से मददगार था यहां पर ....

यदि आप पूरी सेवा में रुचि रखते हैं, तो आप निम्न लिंक पर मेरे ब्लॉग पर अधिक जानकारी प्राप्त कर सकते हैं: File Transfer with WCF

2

क्या आपको अनुरोध और प्रतिक्रिया दोनों पर स्ट्रीमिंग की आवश्यकता है (यानी भारी मात्रा में डेटा हस्तांतरण)? या सिर्फ प्रतिक्रिया पर (आमतौर पर: एक फ़ाइल या बड़े डेटा सेट डाउनलोड)?

आप प्रतिक्रिया पर केवल जरूरत है, तो आप transfermode करने के लिए "StreamedResponse" स्थापित करने के लिए प्रयास करना चाहिए:

<customBinding> 
    <binding name="customHttpBindingStream"> 
     <textMessageEncoding messageVersion="Soap12" /> 
     <httpTransport transferMode="StreamedResponse" 
         maxReceivedMessageSize="2147483647"/> 
    </binding> 
</customBinding> 

"स्ट्रीम" सेटिंग दोनों तरीकों से स्ट्रीम होगा - इन दोनों अनुरोध सर्वर को जा रहा है, के रूप में सर्वर से प्रतिक्रिया के रूप में अच्छी तरह से स्ट्रीम किया जाएगा। अक्सर नहीं, यह आदर्श परिदृश्य नहीं है।

मार्क

+0

हाय मार्क है, जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, मैं एक फाइल सेवा बना रहा हूं जो फ़ाइलों को अपलोड और डाउनलोड करने की अनुमति देता है । इसलिए मुझे दोनों तरीकों से स्ट्रीम करने में सक्षम होना चाहिए। क्या आपको लगता है कि मुझे उस त्रुटि के साथ कुछ करना है जो मुझे अनुभव हो रहा है? –

+0

सुनिश्चित नहीं हैं कि - मैं पहले संदेश अनुबंधों के साथ स्ट्रीमिंग का संयोजन कभी नहीं देखा है ..... और मैं ऐसे मामलों में जहां केवल सर्वर से डाउनलोड बड़ा था (फ़ाइलों को डाउनलोड) देखा है और StreamedResponse को TransferMode की स्थापना –

+0

करता है मदद की यह काम करता है अगर आप केवल डेटा कंट्रैक्ट (संदेश अनुबंध भाग के बिना) का उपयोग करते हैं - –

0

मुझे 'डब्ल्यूसीएफ सेवा' टेम्पलेट के बजाय एसवीसी फ़ाइल जेनरेट करने के लिए 'डब्ल्यूसीएफ डेटा सेवा' टेम्पलेट का उपयोग करने में त्रुटि मिली। सर्विस होस्ट फ़ाइल को सुधारने के लिए समस्या हल हो गई थी।

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