c# - Set ReaderQuotas.MaxStringContentLength, in WCF via reflection WSHttpBinding -
i need consume wcf when don't know type of binding, basichttpbinding or wshttpbinding. created simple solution test without reflection , works. when try use in project via reflection, when use wshttpbinding, exception (spanish):
{system.xml.xmlexception: se superó la cuota de longitud del contenido de cadena (8192) al leer los datos xml. esta cuota se puede aumentar cambiando la propiedad maxstringcontentlength en el objeto xmldictionaryreaderquotas que se usa para crear el lector xml. línea 1, posición 10572. en system.xml.xmlexceptionhelper.throwxmlexception(xmldictionaryreader reader, string res, string arg1, string arg2, string arg3) en system.xml.xmldictionaryreader.readcontentasstring(int32 maxstringcontentlength) en system.xml.xmlbasereader.readcontentasstring() en system.xml.xmlbasereader.readelementcontentasstring() en system.servicemodel.dispatcher.primitiveoperationformatter.partinfo.readvalue(xmldictionaryreader reader) en system.servicemodel.dispatcher.primitiveoperationformatter.deserializeparameter(xmldictionaryreader reader, partinfo part) en system.servicemodel.dispatcher.primitiveoperationformatter.deserializeresponse(xmldictionaryreader reader, object[] parameters) en system.servicemodel.dispatcher.primitiveoperationformatter.deserializereply(message message, object[] parameters)} in basichttpbinding works ok, (when configure wcf binding)
i put in web.config code in wshttpbinding server
<?xml version="1.0"?> <configuration> <system.web> <compilation debug="true" targetframework="4.0" /> </system.web> <system.servicemodel> <behaviors> <servicebehaviors > <behavior name="servicebehaviors" > <!-- avoid disclosing metadata information, set value below false , remove metadata endpoint above before deployment --> <servicemetadata httpgetenabled="true"/> <!-- receive exception details in faults debugging purposes, set value below true. set false before deployment avoid disclosing exception information --> <servicedebug includeexceptiondetailinfaults="false" /> <servicecredentials> <servicecertificate findvalue="localhost" x509findtype="findbysubjectname" storelocation="localmachine" storename="my" /> <usernameauthentication usernamepasswordvalidationmode="custom" customusernamepasswordvalidatortype="testservice.customvalidator, testservice" /> </servicecredentials> </behavior> </servicebehaviors> </behaviors> <bindings> <wshttpbinding> <binding closetimeout="00:10:00" opentimeout="00:10:00" sendtimeout="00:10:00" maxbufferpoolsize="2147483647" maxreceivedmessagesize="2147483647"> <readerquotas maxdepth="2147483647" maxstringcontentlength="2147483647" maxarraylength="2147483647" maxbytesperread="2147483647" maxnametablecharcount="2147483647" /> <security mode="message"> <transport clientcredentialtype="none" /> <message clientcredentialtype="none" /> </security> </binding> </wshttpbinding> </bindings> <services> <service behaviorconfiguration="servicebehaviors" name="testservice.service1"> <endpoint binding="wshttpbinding" contract="testservice.iservice1" /> <endpoint address="mex" binding="mexhttpsbinding" contract="imetadataexchange" /> </service> </services> <servicehostingenvironment multiplesitebindingsenabled="true" /> </system.servicemodel> <system.webserver> <modules runallmanagedmodulesforallrequests="true"/> </system.webserver> </configuration> this works without reflection, test server put in app.config client simple code:
<bindings> <wshttpbinding> <binding name="wshttpbinding_iservice1"> <readerquotas maxstringcontentlength="2147483647" /> <security> <message clientcredentialtype="none" /> </security> </binding> </wshttpbinding> </bindings> but can't put in other project because wcf change. have code in c# configure dynamic web service, doesn't work:
propertyinfo channelfactoryproperty = proxyinstance.gettype().getproperty("channelfactory"); if (channelfactoryproperty == null) { throw new invalidoperationexception("there no ''channelfactory'' property on domainclient."); } channelfactory factory = (channelfactory)channelfactoryproperty.getvalue(proxyinstance, null); factory.endpoint.binding.sendtimeout = new timespan(0, 10, 0); factory.endpoint.binding.opentimeout = new timespan(0, 10, 0); factory.endpoint.binding.receivetimeout = new timespan(0, 10, 0); factory.endpoint.binding.closetimeout = new timespan(0, 10, 0); propertyinfo channelfactorypropert = proxyinstance.gettype().getproperty("innerchannel"); system.servicemodel.iclientchannel factor = (system.servicemodel.iclientchannel)channelfactorypropert.getvalue(proxyinstance, null); factor.operationtimeout.add(new timespan(0, 10, 0)); factor.operationtimeout = new timespan(0, 10, 0); switch ((factory.endpoint.binding).gettype().tostring()) { case "system.servicemodel.basichttpbinding": basichttpbinding _basicbinding = (basichttpbinding)factory.endpoint.binding; _basicbinding.maxbufferpoolsize = 2147483647; _basicbinding.maxbuffersize = 2147483647; _basicbinding.maxreceivedmessagesize = 2147483647; _basicbinding.opentimeout = new timespan(0, 10, 0); break; case "system.servicemodel.wshttpbinding": wshttpbinding _wsbinding = (wshttpbinding)factory.endpoint.binding; _wsbinding.maxbufferpoolsize = 2147483647; _wsbinding.maxreceivedmessagesize = 2147483647; _wsbinding.opentimeout = new timespan(0, 10, 0); _wsbinding.readerquotas.maxstringcontentlength = 2147483647; xmldictionaryreaderquotas _wsbindingrq = (xmldictionaryreaderquotas)_wsbinding.readerquotas; _wsbindingrq.maxarraylength = 2147483647; _wsbindingrq.maxbytesperread = 2147483647; _wsbindingrq.maxnametablecharcount = 2147483647; _wsbindingrq.maxstringcontentlength = 2147483647; break; } i don't know code configure in c# in app.config in project, empty.
i needed put code before create instance of object. code above (in question) it's ok. proxyinstance = compilerresults.compiledassembly.createinstance(proxytype.name, false, system.reflection.bindingflags.createinstance, null, new object[] { serviceendpoint.binding, serviceendpoint.address }, system.globalization.cultureinfo.currentculture, null);
Comments
Post a Comment