वहां बहुत सारे प्रश्न हैं, लेकिन मैंने उनमें से प्रत्येक में हर समाधान का कोई फायदा नहीं लिया है।WebServiceHostFactory MaxReceivedMessageSize को ओवरराइड कैसे करें?
हमारे पास एक वेब सेवा है जो WebServiceHostFactory के साथ शुरू होती है, लेकिन यदि 64k से अधिक किसी को फेंक दिया जाता है, तो हमें '400 खराब अनुरोध' मिलता है। आम तौर पर, यह MaxReceivedMessageSize, MaxBufferSize और MaxBufferPoolSize को बढ़ाकर हल किया जाएगा। समस्या यह है कि WebServiceHostFactory का उपयोग करके, Web.Config पूरी तरह से अनदेखा किया जाता है। सेवा मॉडल अनुभाग में कोई भी बदलाव सेवा में प्रतिबिंबित नहीं होता है।
वेब सेवा HostFactory को पूरी तरह से डुबोना और स्क्रैच से web.config सेट करना अच्छा होगा, लेकिन हमारी सेवा इसके बिना नहीं चली जाएगी। विधियों में से एक में स्ट्रीम पैरामीटर के साथ-साथ कुछ अन्य स्ट्रिंग पैरा भी हैं। कारखाने के बिना, हमें
System.InvalidOperationException: For request in operation Test to be a stream the operation must have a single parameter whose type is Stream
तो यह कारखाने को हटाने का विकल्प नहीं है। मैं वास्तव में काम नहीं कर सकता कि फैक्ट्री क्या कर रही है जो इस त्रुटि को हल करती है लेकिन मैंने 4 दिन बिताए और कहीं भी नहीं मिला।
मैं भी प्रोग्राम के MaxReceivedMessageSize अधिभावी की कोशिश की है, कुछ उदाहरण मैं जगह के आसपास पर पाया साथ:
protected override void OnOpening()
{
base.OnOpening();
foreach (var endpoint in Description.Endpoints)
{
//var binding = endpoint.Binding as WebHttpBinding;
//if (binding != null)
//{
// binding.MaxReceivedMessageSize = 20000000;
// binding.MaxBufferSize = 20000000;
// binding.MaxBufferPoolSize = 20000000;
// binding.ReaderQuotas.MaxArrayLength = 200000000;
// binding.ReaderQuotas.MaxStringContentLength = 200000000;
// binding.ReaderQuotas.MaxDepth = 32;
//}
//var transport = endpoint.Binding.CreateBindingElements().Find<HttpTransportBindingElement>();
//if (transport != null)
//{
// transport.MaxReceivedMessageSize = 20000000;
// transport.MaxBufferPoolSize = 20000000;
//}
var newTransport = new HttpTransportBindingElement();
newTransport.MaxReceivedMessageSize = 20000000;
newTransport.MaxBufferPoolSize = 20000000;
endpoint.Binding.CreateBindingElements().Add(newTransport);
}
}
पहला कारखाना के रूप में काम नहीं करता है एक CustomBinding जो एक WebHttpBinding में ढाला नहीं जा सकता है बनाता है। दूसरा काम नहीं करता है क्योंकि ऐसा लगता है कि बाध्यकारी तत्व केवल पढ़े जाते हैं - इससे कोई फर्क नहीं पड़ता कि मैंने तत्वों को क्या सेट किया है, कुछ भी नहीं बदला है, जिसे मैंने 'बदलते' के बाद मूल्यों को वापस पढ़कर सत्यापित किया है। तीसरा एक नया बाध्यकारी तत्व था जो वहां एक नया बाध्यकारी तत्व फेंकने का प्रयास करता था, लेकिन निश्चित रूप से यह भी असफल रहा।
अब हम पूरी तरह से नुकसान में हैं। हम इस चीज़ को चलाने के लिए कैसे प्राप्त कर सकते हैं? आपको लगता है कि यह इतना आसान होगा!
धन्यवाद लोग
Web.Config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<compilation targetFramework="4.0" />
</system.web>
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="rest" maxReceivedMessageSize="500000000" />
</webHttpBinding>
</bindings>
<services>
<service name="SCAPIService" behaviorConfiguration="ServiceBehaviour">
<endpoint address="" binding="webHttpBinding" bindingConfiguration="rest" contract="ISCAPIService" behaviorConfiguration="web">
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>
संपादित करें, सुझाव दिया गया समाधान है कि अब तक असफल रहा है का उपयोग करते हुए:
public class MyServiceHost : WebServiceHost
{
public MyServiceHost()
{
}
public MyServiceHost(object singletonInstance, params Uri[] baseAddresses)
: base(singletonInstance, baseAddresses)
{
}
public MyServiceHost(Type serviceType, params Uri[] baseAddresses)
: base(serviceType, baseAddresses)
{
}
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
APIUsers.TestString += "here" + Description.Endpoints.Count.ToString();
foreach (var endpoint in this.Description.Endpoints)
{
var binding = endpoint.Binding;
APIUsers.TestString += binding.GetType().ToString();
if (binding is WebHttpBinding)
{
var web = binding as WebHttpBinding;
web.MaxBufferSize = 2000000;
web.MaxBufferPoolSize = 2000000;
web.MaxReceivedMessageSize = 2000000;
}
var myReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas();
myReaderQuotas.MaxStringContentLength = 2000000;
myReaderQuotas.MaxArrayLength = 2000000;
myReaderQuotas.MaxDepth = 32;
binding.GetType().GetProperty("ReaderQuotas").SetValue(binding, myReaderQuotas, null);
}
}
}
class MyWebServiceHostFactory : WebServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return new MyServiceHost(serviceType, baseAddresses);
}
}
धन्यवाद राजेश। हालांकि यह अभी भी मेरे लिए काफी काम नहीं कर रहा है - किसी कारण से लागू होने पर कोई अंतराल नहीं है कॉन्फ़िगरेशन कहा जाता है - इसलिए यह इसे फ़ोरैच लूप के अंदर भी कभी नहीं बनाता है। चूंकि फैक्ट्री सभी विवरण निर्माण कर रही है, आप आवेदन कॉन्फ़िगरेशन को निकालने से पहले एंडपॉइंट कैसे बना सकते हैं? –
क्या आपके लिए अधिक सहायता प्रदान करने के लिए आपके पास फैक्ट्री कोड पोस्ट करना संभव है। – Rajesh
निश्चित रूप से, मैंने कोड के साथ प्रश्न अपडेट किया है। घोषणापत्र इस तरह दिखता है: <% @ ServiceHost भाषा = "सी #" डीबग = "सत्य" सेवा = "एपिनमेस्पेस। सेवा" कोडबहाइंड = "सेवा.svc.cs" फैक्टरी = "WcfService1.MyWebServiceHostFactory"%> मेरे कोड में , APIUsers.TestString मुद्रित किया गया है, बस यह सुनिश्चित करने के लिए कि यह कोड चल रहा था। नतीजा यहां था 0 (0 = एंडपॉइंट गिनती) –