سؤال

وأنا أحاول أن استخدام WCF الجري مع رسالة عقود لأني بحاجة إلى معلمات إضافية بجانب تيار نفسها.

أساسا أنا إنشاء ملف تحميل تحميل الخدمة ، مع بعض منطق إضافية على القمة.

للأسف عندما كنت في محاولة لضرب الخدمة من المتصفح للتأكد من أن كل شيء على ما يرام ، أحصل على الخطأ التالي:

خطأ في الخادم في '/' التطبيق.عملية 'UploadFile' العقد 'IFileTransferService' يستخدم MessageContract يحتوي الصابون رؤوس.الصابون رؤوس لا تدعمها أي MessageVersion.

للأسف غوغلينغ لأنه لم تسفر عن أي نتيجة هامة التي ساعدتني.هل لديكم مساعدتي ؟ هنا تفاصيل خدمة (لقد أزالت تحميل جزء لسبب من الفضاء).

[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 ملزمة مع عدم تأثير إيجابي:

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

التحديث:قراءة الوثائق على الانترنت يبدو أن الجري مع MessageContracts ينبغي أن يكون من الممكن بالفعل.أشير على سبيل المثال إلى MSDN (البيانات الكبيرة و الجري):

نموذج البرمجة على تدفق التحويلات

نموذج البرمجة لتدفق هو واضحة.لتلقي دفق البيانات ، حدد العملية عقد تيار واحد كتبته معلمة الإدخال.من أجل العودة دفق البيانات ، عودة تيار المرجعية.[...] هذه القاعدة بالمثل ينطبق على رسالة عقود.كما هو مبين في الرسالة التالية العقد ، يمكن أن يكون واحد فقط عضو في الجسم الرسالة العقد الذي هو تيار.إذا كنت ترغب في التواصل معلومات إضافية مع تيار هذه المعلومات يجب أن تكون نفذت في رؤوس الرسائل.على رسالة الهيئة هي حصرا من أجل دفق المحتوى.

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

لقد رأيت أيضا بلوق وظيفة من الناس إنجاز الخدمات من الملفات وتحميل مشابهة جدا ما أحاول أن أضع معا (على سبيل المثال هنا).

تحديث 2 لقد حاولت إنشاء وحدة صغيرة و النفس استضافة الخدمة مع basicHttpBinding و هناك من يعمل مثل السحر.أنا بدأت أعتقد أن المشكلة قد تكون الاستضافة على IIS.أي فكرة ؟

تحديث 3 انظر بلدي الإجابة.

هل كانت مفيدة؟

المحلول

وأخيرا وجدت ما كان خطأ:لا علاقة مع الصابون إصدارات, تيارات, الخ...أنا فقط mispelled اسم بلدي الخدمة (!) ، باستخدام FileTransfer بدلا من FileTransferService.

في النهاية basicHttpBinding كان على ما يرام تماما, لم أكن بحاجة إلى اللجوء إلى العرف ملزم.

الأصلي (سيئة) الإصدار:

<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>

ما زلت لا أستطيع أن أقول أن رسالة الخطأ كان مفيدا في أي وسيلة لفهم ما يجري هنا....

إذا كنت مهتما في خدمة كاملة, يمكنك العثور على مزيد من التفاصيل على مدونتي على الرابط التالي: نقل الملفات مع WCF

نصائح أخرى

هل تحتاج إلى تدفق (أينقل humonguous البيانات كميات) سواء على طلب الرد ؟ أو فقط عن الاستجابة (عادة:تحميل ملف أو مجموعة كبيرة من البيانات)?

إذا كنت بحاجة فقط على الاستجابة ، يجب أن تحاول ضبط transfermode إلى "StreamedResponse":

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

في "بث" الإعداد تيار كل الطرق - كل من طلب الذهاب إلى الخادم ، وكذلك استجابة من الملقم سيتم بث.في كثير من الأحيان لا, ليس هذا هو السيناريو المثالي.

مارك

حصلت على الخطأ بعد استخدام 'WCF خدمة البيانات' قالب لتوليد الملف svc بدلا من 'خدمة WCF' القالب.تصحيح خدمة استضافة الملفات تم حل المشكلة.

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