عميل WCF - فقط 255 بايت من الدفق الذي تم إرجاعه من خدمة WCF يحتوي على قيم

StackOverflow https://stackoverflow.com/questions/3695541

سؤال

لقد تم تكليف لي برعاية تطبيق ASP.NET WebForms الذي يتواصل مع خدمة WCF التي تستضيفها خدمة Windows. الربط المستخدم للخدمة هو nettcpbinding.

تكشف الخدمة عن طرق لتحميل وتنزيل "ملفات". يحدد المستخدم لتحميل ملف ويتم تمرير httppostfile.inputSteam مباشرة إلى الخدمة كمعلمة في طريقة "تحميل" الخدمة. تقوم الخدمة بحفظ الدفق كصفيف بايت لقاعدة البيانات [نوع بيانات حقل قاعدة البيانات هو varbinary (Max)].

تدفق بيانات تنزيل الملف هو في الأساس العملية العكسية. يتم استرداد البايتات من قاعدة البيانات ؛ تم تحميله في MemoryStream في خدمة WCF ؛ ثم عاد إلى تطبيق الويب.

لقد التقطت البيانات الواردة في التدفقات (المرسلة / المستلمة) في كل خطوة في العمليات أعلاه - على العميل (تطبيق الويب) والخدمة. لقد قمت بالتحلق وكتبت إلى ملف مسطح البايتات الواردة في كل تيار.

صفيف البايت في كل حالة متطابقة [قيمة البايت ؛ وعدد البايتات في الدفق] باستثناء عملية تنزيل الملف. عند النقطة التي يتم فيها إرجاع الدفق إلى تطبيق الويب من خدمة WCF. هنا عدد البايتات المستلمة صحيحة ولكن يتم ملء أول 255 بايت. قيم البايتات المتبقية هي صفر

لقد قمت بإجراء مجموعة من التغييرات التجريبية على قيم الربط - في كل من العميل في الخدمة - حيث أعتقد أن المشكلة يجب أن تكمن هنا. حتى الآن لم أتأثر بوضع البايتات التي تم إرجاعها بأي شكل من الأشكال. لا تظهر سجلات العميل والخدمة أي استثناءات يتم طرحها أو أي مشاكل أخرى.

ليس لدي الكثير من الخبرة في تعيين المجموعات الصحيحة لسمات الربط (والتكوين الآخر) لتطبيقات العميل والخادم - بعد أن اعتمدت على الافتراضات في الماضي. نحتاج إلى تكوين الخدمة والعميل لنقل الحد الأقصى لحجم الملف المسموح به. لسوء الحظ لا يمكنني استخدام MTOM.

هذه النشر والروابط ، لم تقدم لي أي نظرة ثاقبة. حتى الآن لم أجد أي معلومات أخرى تساعد.

نأمل أن يساعدني شخص ما بما قد تكون عليه المشكلة. فيما يلي الروابط التي أستخدمها:

العميل [web.config]:

  <bindings>  
         <netTcpBinding>
            <binding name="TCP"  
                       closeTimeout="00:01:00" 
                       openTimeout="00:10:00"
                       receiveTimeout="00:01:00" sendTimeout="00:01:00" 
                       transferMode="Streamed" 
                       maxBufferPoolSize="512"
                       maxBufferSize="2147483647" 
                       maxConnections="10" 
                       maxReceivedMessageSize="2147483647">     

               <readerQuotas maxDepth="32" 
                             maxStringContentLength="2147483647" 
                             maxArrayLength="2147483647"
                             maxBytesPerRead="4096" 
                             maxNameTableCharCount="2147483647" />
               <reliableSession ordered="true" inactivityTimeout="00:10:00"
                 enabled="false" />
               <security mode="Transport">
                  <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                  <message clientCredentialType="Windows" />
               </security>
            </binding>
         </netTcpBinding>

خدمة:

<netTcpBinding>
        <binding name="netTCP"
                 closeTimeout="00:01:00"
                 openTimeout="00:01:00"
                 receiveTimeout="00:01:00" sendTimeout="00:01:00"
                 transferMode="Streamed"
                 listenBacklog="30"
                 maxBufferPoolSize="512"
                 maxBufferSize="2147483647"
                 maxConnections="30"
                 maxReceivedMessageSize="2147483647"
                 portSharingEnabled="true">
          <readerQuotas maxDepth="32"
                        maxStringContentLength="2147483647"
                        maxArrayLength="2147483647"
                        maxBytesPerRead="4096"
                        maxNameTableCharCount="2147483647" />
        </binding>
      </netTcpBinding>
هل كانت مفيدة؟

المحلول

ما أغباني. أعتقد أنني حصلت عليه.

كانت الروابط على ما يرام. لم أكن أتعامل مع قراءة البايتات بشكل صحيح من الدفق إلى المخزن المؤقت على العميل.

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