Specifying WCF Binding When Using ServiceRoute

I am currently registering a WCF service using the following code:

var factory = new DefaultServiceHostFactory(); RouteTable.Routes.Add(new ServiceRoute("XXXEndPoint", factory, IXXXEndPoint))); 

This is all good and good, but I also need to change the MaxStringContentLength property of reader quota settings. It seems like the default value of 8192 is being used, regardless of my attempts to change this, and I assume this is from the DefaultServiceModel?

Are there any suitable interceptors for overriding this parameter in the DefaultServiceModel module, or should I output my own host / service model classes, or am I wrong about this?

Any suggestions appreciated.

EDIT: Note that the binding configuration must be done programmatically (not via configuration files).

thanks

+6
wcf
source share
1 answer

You can do this by expanding the host factory. With a small modification of the code below, you can pass an additional parameter to WCFCerviceHostFactory to set it from Global.asax. I used the classes below to always set it to Int32.MaxValue

// in Global.asax

 routes.Add(new ServiceRoute(routePrefix, new WCFServiceHostFactory(), serviceType)); 

//WCFServiceHostFactory.cs

 namespace MyServices.MyService { public class WCFServiceHostFactory:WebServiceHostFactory { protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) { WCFServiceHost host = new WCFServiceHost(serviceType, baseAddresses); return host; } } } 

//WCFServiceHost.cs

 namespace MyServices.MyService { public class WCFServiceHost:WebServiceHost { public WCFServiceHost(): base () { } public WCFServiceHost (object singletonInstance, params Uri [] baseAddresses) : base (singletonInstance, baseAddresses) { } public WCFServiceHost(Type serviceType, params Uri[] baseAddresses) : base (serviceType, baseAddresses) { } protected override void OnOpening () { base.OnOpening (); foreach (Uri baseAddress in BaseAddresses) { bool found = false; foreach (ServiceEndpoint se in Description.Endpoints) if (se.Address.Uri == baseAddress) { found = true; ((WebHttpBinding)se.Binding).ReaderQuotas.MaxStringContentLength = Int32.MaxValue;//here you set it and also set it below } if (!found) { if (ImplementedContracts.Count > 1) throw new InvalidOperationException ("Service '"+ Description.ServiceType.Name + "' implements multiple ServiceContract types, and no endpoints are defined in the configuration file. WebServiceHost can set up default endpoints, but only if the service implements only a single ServiceContract. Either change the service to only implement a single ServiceContract, or else define endpoints for the service explicitly in the configuration file. When more than one contract is implemented, must add base address endpoint manually"); var enumerator = ImplementedContracts.Values.GetEnumerator (); enumerator.MoveNext (); Type contractType = enumerator.Current.ContractType; WebHttpBinding binding = new WebHttpBinding(); binding.ReaderQuotas.MaxStringContentLength = Int32.MaxValue; //here also AddServiceEndpoint (contractType, binding, baseAddress); } } foreach (ServiceEndpoint se in Description.Endpoints) if (se.Behaviors.Find<WebHttpBehavior> () == null) se.Behaviors.Add (new WebHttpBehavior ()); // disable help page. ServiceDebugBehavior serviceDebugBehavior = Description.Behaviors.Find<ServiceDebugBehavior> (); if (serviceDebugBehavior != null) { serviceDebugBehavior.HttpHelpPageEnabled = false; serviceDebugBehavior.HttpsHelpPageEnabled = false; } } } } 
+12
source share

All Articles