غير قادر على تعيين maxReceivedMessageSize من خلال الملف web.config

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

سؤال

ولقد حققت الآن 400 - BadRequest رمز لاثنين من ساعة الماضية. وهناك الكثير من sugestions يذهب نحو ضمان السمة bindingConfiguration تم تعيين بشكل صحيح، وفي حالتي، هو عليه.

والآن، ولست بحاجة مساعدتكم قبل تدمير المبنى وأنا في: -)

وأنا تشغيل خدمة WCF ريستفول (خفيفة جدا، وذلك باستخدام هذا المورد للإلهام: http://msdn.microsoft.com/en-us/magazine/dd315413.aspx ) الذي (حاليا) يقبل XmlElement (POX) المقدمة من خلال الفعل POST.

وأنا حاليا فقط باستخدام عازف الكمان لطلب باني قبل تنفيذ العميل الحقيقي (لأن هذا هو بيئات مختلطة).

وعندما أفعل هذا لXML أصغر من 65K، وأنها تعمل على ما يرام - أكبر، فإنه يلقي هذا الاستثناء: تم تجاوز الحد الأقصى لحجم الرسالة الحصة للرسائل الواردة (65536). لزيادة الحصة النسبية، استخدم الخاصية MaxReceivedMessageSize على عنصر ملزم المناسب.

وهنا هو بلدي ملف web.config (الذي أنا حتى شملت العميل شعارا ل(الأوقات العصيبة)!):

<system.web>
    <httpRuntime maxRequestLength="1500000" executionTimeout="180"/>
  </system.web>
  <system.serviceModel>
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
    </diagnostics>
    <bindings>
      <webHttpBinding>
        <binding name="WebHttpBinding" maxReceivedMessageSize="1500000" maxBufferPoolSize="1500000" maxBufferSize="1500000" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00">
          <readerQuotas maxStringContentLength="1500000" maxArrayLength="1500000" maxBytesPerRead="1500000" />
          <security mode="None"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <client>
      <endpoint address="" binding="webHttpBinding" bindingConfiguration="WebHttpBinding" contract="Commerce.ICatalogue"/>
    </client>
    <services>
      <service behaviorConfiguration="ServiceBehavior" name="Catalogue">
        <endpoint address="" 
                  behaviorConfiguration="RestFull" 
                  binding="webHttpBinding"
                  bindingConfiguration="WebHttpBinding" 
                  contract="Commerce.ICatalogue" />
        <!-- endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" / -->
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="RestFull">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

ويرجع الفضل في ذلك مسبقا لأية مساعدة مما أدى إلى دعوة سوكيسفول مع> 65K XML، -)

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

المحلول

وكل الحق، هذا واحد تسبب لي حقا صعوبة في حل، وأنا لن تدخر الآخرين ل. ويتمثل التحدي في الواقع، أنني استخدمت <%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Service="fullyQualifiedClassName" %>، وهو نهج تنفيذ مصنع لطيفة وسهلة.

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

وكان لي الحل للعودة إلى الطريق أكثر تقليدية من تنفيذ WCF. <%@ ServiceHost Service="fullyQualifiedClassName" CodeBehind="~/App_Code/Catalogue.cs" %>، ومن ثم استخدام قيمي تكوينها بالفعل في ملف web.config.

وهنا هو بلدي تعديل ملف web.config (فيما يتعلق مادوكس الصداع):

<system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="XmlMessageBinding" maxReceivedMessageSize="5000000" maxBufferPoolSize="5000000" maxBufferSize="5000000" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00">
          <readerQuotas maxStringContentLength="5000000" maxArrayLength="5000000" maxBytesPerRead="5000000" />
          <security mode="None"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service name="fullyQualifiedClassName" behaviorConfiguration="DevelopmentBehavior">
        <endpoint name="REST" address="" binding="webHttpBinding" contract="fullyQualifiedInterfaceName" behaviorConfiguration="RestEndpointBehavior" bindingConfiguration="XmlMessageBinding" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="RestEndpointBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="DevelopmentBehavior">
          <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
        <behavior name="ProductionBehavior">
          <serviceDebug httpHelpPageEnabled="false" includeExceptionDetailInFaults="false"/>
          <serviceMetadata httpGetEnabled="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

وفائدة أخرى من هذا التغيير هو، أنه يمكنك الآن مرجع خدمة WCF الراحة الخاصة بك مباشرة من صافي. هذا لا يمكن أن يتم إلا باستخدام نموذج مصنع وتنفيذ نظري XmlElement من خلال الخروج من الحل.

وآمل أن يكون هذا يمكن أن يساعد الآخرين مع قضايا مماثلة ...

نصائح أخرى

وأعرف أن هذا هو سؤال قديم جدا ولها بالفعل جوابا ...

وعلى أي حال ...

وماذا فعلت لحل هذه "القضية" أنا خلقت مصنع الموروثة من WebServiceHostFactory وخلق المضيف دائرة الجمارك رثت من WebServiceHost

وفي المضيف I تجاهلت طريقة OnOpening مثل هذا

protected override void OnOpening()
        {
            base.OnOpening();

            foreach (var endpoint in Description.Endpoints)
            {
                var binding = endpoint.Binding as System.ServiceModel.Channels.CustomBinding;

                foreach (var element in binding.Elements)
                {
                    var httpElement = element as System.ServiceModel.Channels.HttpTransportBindingElement;
                    if (httpElement != null)
                    {
                        httpElement.MaxBufferSize = 2147483647;
                        httpElement.MaxReceivedMessageSize = 2147483647;
                    }
                }
            }

        }

وأعتقد كان لي نفس المشكلة، ولكن عندما تكوين الافتراضي ملزم لwebHttp ثم عملت:

<bindings>
        <webHttpBinding>
            <binding maxReceivedMessageSize="2000000"
                      maxBufferSize="2000000">
                <readerQuotas maxStringContentLength="2000000"/>
            </binding>
        </webHttpBinding>
    </bindings>

لاحظ: لا يوجد اسم على الربط.

وهذا هو دخول بلوق كتبت أن يستنسخ هذه المشكلة مع الحد الأدنى تماما WCF الخادم والعميل قطعة:

WCF - تحديد العميل طول السلسلة الجانبية استثناءات

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

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