خطأ استدعاء WCF بقية الخدمات باستخدام جسون.طول الحصص (8192) تجاوز

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

سؤال

أنا أعاني WCF بقية استضافتها في خدمة IIS باستخدام .صافي 4 RC.بعد المكالمات إلى خدمة تسلسل باستخدام جسون.كل شيء يعمل بشكل جيد حتى حجم واحد من DataMember (سلسلة) أطول من 8K.في هذه الحالة أنا تتلقى رسالة الخطأ الموضحة أدناه يبين MaxStringContentLength تم تجاوزها.على maxStringContentLength سمة نقطة النهاية تم زيادة وهي قراءة صحيحة من ملف التكوين.

Web config:

<services>
  <service name="MyServiceServer" >
    <endpoint address="http://localhost/MyService" kind="webHttpEndpoint" endpointConfiguration="serviceEndPoint" contract="IMyService">
    </endpoint>
  </service>
</services>

<standardEndpoints>
  <webHttpEndpoint>
    <standardEndpoint name="serviceEndPoint" maxReceivedMessageSize="2048000"  maxBufferSize="2048000" maxBufferPoolSize="0">
      <readerQuotas maxStringContentLength="2048000" maxArrayLength="2048000"  maxDepth ="65000"/>
      <security mode="None">
        <transport clientCredentialType="None"/>
      </security>
    </standardEndpoint>
  </webHttpEndpoint>
</standardEndpoints>

IMyService واجهة بأنها:

public interface IMyService
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "/request", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    void MyMehod(<Class Type> obj);
}

إكمال رسالة الخطأ:

"واجه الخادم خطأ في معالجة الطلب.رسالة الاستثناء 'هناك خطأ في تسلسل كائن من نوع .أقصى محتوى سلسلة طول الحصص (8192) تم تجاوز أثناء قراءة بيانات XML.هذه الحصة قد تكون بنسبة تغيير MaxStringContentLength الملكية على إكسملديكتيوناريريديرقوتاس المستخدم عند إنشاء XML القارئ.'.انظر سجلات الملقم للحصول على مزيد من التفاصيل.فإن تتبع مكدس الاستثناء هو:في النظام.وقت التشغيل.التسلسل.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator القارئ, منطقية verifyObjectName, DataContractResolver dataContractResolver) في النظام.وقت التشغيل.التسلسل.Json.DataContractJsonSerializer.ReadObject(XmlDictionaryReader القارئ, منطقية verifyObjectName) في النظام.ServiceModel.المرسل.SingleBodyParameterMessageFormatter.DeserializeRequest(رسالة رسالة كائن[] المعلمات) في النظام.ServiceModel.المرسل.DemultiplexingDispatchMessageFormatter.DeserializeRequest(رسالة رسالة كائن[] المعلمات) في النظام.ServiceModel.المرسل.UriTemplateDispatchFormatter.DeserializeRequest(رسالة رسالة كائن[] المعلمات) في النظام.ServiceModel.المرسل.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) في النظام.ServiceModel.المرسل.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) في النظام.ServiceModel.المرسل.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) في النظام.ServiceModel.المرسل.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) في النظام.ServiceModel.المرسل.MessageRpc.عملية(منطقية isOperationContextSet)"

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

المحلول

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

وأود في هذا الملف في ظل الخلل WCF لأنه إما:

  1. عناوين url النسبية يجب أن يكون غير مسموح بها (و مناسب استثناء طرح)

أو

  1. القارئ الحصص يجب أن تعمل مع المسارات النسبية وكذلك

نصائح أخرى

وإدراج في الملف web.config الخاص بك:

<configuration>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="webHttpBindingConfig">
          <readerQuotas maxStringContentLength="2048000" />
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

ووإدراج السمة bindingConfiguration = "webHttpBindingConfig" الدخول الى حسابك في نقطة النهاية

لدي مشاكل مماثلة ولكن مع .NET framework 3.5

لم يكن لدي أي مشاكل على السيرفر, لذلك كانت المشكلة على العميل.يبدو أن التكوين مع max القيم زيادة لا تستخدم...

لذا حلها يمر اسم نقطة النهاية صراحة في منشئ WebChannelFactory ، وذلك باستخدام آخر الزائد.

كان:

WebChannelFactory<IWKRestTest> factory = new WebChannelFactory<IWKRestTest>(new Uri(XXX));
factory.Credentials.UserName.UserName = K_USERNAME;
factory.Credentials.UserName.Password = K_PASSWORD;
IWKRestTest proxy = factory.CreateChannel();

هو:

WebChannelFactory<IWKRestTest> factory = new WebChannelFactory<IWKRestTest>("IWKRestTestService");

و في التطبيق.التكوين هناك:

Uri هو مبين في النهاية عقدة ولكن هناك تجد أيضا bindingConfiguration على كل جديد زيادة حدود الآن يعمل.

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