No problem. Glad we found a simple solution. I may just bake that one into the facility
Sent from my iPhone On Oct 14, 2010, at 2:09 PM, João Bragança <[email protected]> wrote: > Outstanding! Thank you. > > On Oct 14, 10:56 am, Craig Neuwirt <[email protected]> wrote: >> Ok, here it the correct version ;-) >> >> public class AdjustQuotasBehavior : AbstractServiceHostAware >> { >> private const int FIVE_MEGABYTES = 1024 * 1024 * 5; >> protected override void Opening(ServiceHost serviceHost) >> { >> var defaultServiceHost = serviceHost as >> DefaultServiceHost; >> >> if (defaultServiceHost != null) >> { >> defaultServiceHost.EndpointCreated += (_, >> newEndpoint) => >> { >> var binding = >> newEndpoint.Endpoint.Binding as BasicHttpBinding; >> if (binding != null) >> { >> binding.MaxBufferSize = >> FIVE_MEGABYTES; >> binding.MaxBufferPoolSize = >> FIVE_MEGABYTES; >> >> binding.MaxReceivedMessageSize = FIVE_MEGABYTES; >> >> binding.ReaderQuotas.MaxArrayLength = FIVE_MEGABYTES; >> >> binding.ReaderQuotas.MaxDepth = FIVE_MEGABYTES; >> >> binding.ReaderQuotas.MaxStringContentLength = FIVE_MEGABYTES; >> >> binding.ReaderQuotas.MaxBytesPerRead = FIVE_MEGABYTES; >> >> binding.ReaderQuotas.MaxNameTableCharCount = FIVE_MEGABYTES; >> } >> }; >> } >> } >> } >> >> Idea was correct, but the Opening hook was called before WCF Faciity added >> new endpoint (hence no endpoints). >> Therefore, I just hooked onto the EndpointCreatedEvent >> >> cheers, >> craig >> >> On Oct 14, 2010, at 11:24 AM, João Bragança wrote: >> >> >> >> >> >> >> >>> Unfortunately no. I tried this approach already. As I understand it, >>> the only thing allowed in the message body is a Stream, and the method >>> must return void. I need to upload an image, insert a record into the >>> database, and receive a PK back. This is used in the next request. >> >>> If I switched to net 4.0 would I be able to easily get this done? >> >>> On Oct 14, 5:27 am, Craig Neuwirt <[email protected]> wrote: >>>> We may be going about this the wrong way. I think a better approach for >>>> uploading images is to use the WCF streaming model. This should eliminate >>>> the size issue, but you will need to configure a binding to specify it. >> >>>> Here is a good >>>> posthttp://weblogs.asp.net/cibrax/archive/2007/08/29/sending-attachments-... >> >>>> Are you able to do this in your app? >> >>>> On Oct 13, 2010, at 1:26 PM, João Bragança wrote: >> >>>>> No, not really. The actual client is a Flex/AIR application. >> >>>>> On Oct 13, 10:22 am, Craig Neuwirt <[email protected]> wrote: >>>>>> Do you happen to have a client the performs the upload with the image >>>>>> culprit? If not, I can write one. >> >>>>>> On Oct 12, 2010, at 1:28 PM, João Bragança wrote: >> >>>>>>> Here's a repo of the bug. Thanks again for taking a look! >> >>>>>>> ---------- Forwarded message ---------- >>>>>>> From: Craig Neuwirt <[email protected]> >>>>>>> Date: Oct 12, 11:00 am >>>>>>> Subject: Wcf Facility, DefaultBinding and Quota Exceeded >>>>>>> To: Castle Project Users >> >>>>>>> Any chance you can zip me a subset of your app so I can run it locally >>>>>>> and try and find a solution for you? Just enough to demonstrate the i >> >>>>>>> On Oct 12, 2010, at 11:24 AM, João Bragança wrote: >> >>>>>>>> Craig, >> >>>>>>>> In OnOpening the serviceHost doesn't have any bindings. I tried it in >>>>>>>> OnOpened but I got the same error. >> >>>>>>>> On Oct 12, 8:06 am, Craig Neuwirt <[email protected]> wrote: >>>>>>>>> Good question. WCF makes it a real pain to manipulate the quota >>>>>>>>> stuff. >> >>>>>>>>> I am not sure the best way to handle this, but this might work for you >> >>>>>>>>> create >> >>>>>>>>> public class AdjustQuotasBehavior : AbstractServiceHostAware >>>>>>>>> { >>>>>>>>> protected override Opening(ServiceHost serviceHost) >>>>>>>>> { >>>>>>>>> foreach (var endpoint in serviceHost.Description.Endpoints) >>>>>>>>> { >>>>>>>>> var binding = endpoint.Binding as BasicHttpBinding; >>>>>>>>> if (binding != null) >>>>>>>>> { >>>>>>>>> binding.ReaderQuotas.MaxArrayLength = >>>>>>>>> FIVE_MEGABYTES; >>>>>>>>> // Do same for other >>>>>>>>> } >>>>>>>>> } >>>>>>>>> } >> >>>>>>>>> } >> >>>>>>>>> And register this component in container >> >>>>>>>>> container.Register(Component.For< AdjustQuotasBehavior>()) >> >>>>>>>>> I have never tried this though. I could add service binding >>>>>>>>> inference from base address like I did with clients, but this would >>>>>>>>> only work for 3.5 >>>>>>>>> since I used the default endpoint support out of the box for WCF 4.0 >> >>>>>>>>> Let me know how this goes and we'll find another way if this doesn't >>>>>>>>> work >> >>>>>>>>> good luck, >>>>>>>>> craig >> >>>>>>>>> On Oct 12, 2010, at 9:38 AM, João Bragança wrote: >> >>>>>>>>>> What is the simplest way to override this? I really don't want to >>>>>>>>>> configure all the endpoints by hand if I can avoid it. >> >>>>>>>>>> On Oct 12, 6:34 am, Craig Neuwirt <[email protected]> wrote: >>>>>>>>>>> If I recall, the DefaultBinding stuff comes into play when you >>>>>>>>>>> specify endpoints without bindings. I think in your case, the >>>>>>>>>>> default endpoint logic is getting applied which is based on the >>>>>>>>>>> base address and not the default binding. >> >>>>>>>>>>> On Oct 11, 2010, at 7:23 PM, João Bragança wrote: >> >>>>>>>>>>>> I have a WCF service where I need to upload images. I am >>>>>>>>>>>> configuring >>>>>>>>>>>> it like so: >> >>>>>>>>>>>> public class WcfServicesInstaller : IWindsorInstaller >>>>>>>>>>>> { >>>>>>>>>>>> private const int FIVE_MEGABYTES = 1024*1024*5; >> >>>>>>>>>>>> private const string SERVICE_SUFFIX = "Service"; >> >>>>>>>>>>>> #region IWindsorInstaller Members >> >>>>>>>>>>>> public void Install(IWindsorContainer container, >>>>>>>>>>>> IConfigurationStore >>>>>>>>>>>> store) >>>>>>>>>>>> { >>>>>>>>>>>> container.AddFacility<WcfFacility>(f => >>>>>>>>>>>> f.DefaultBinding = new >>>>>>>>>>>> BasicHttpBinding >>>>>>>>>>>> >>>>>>>>>>>> { >> >>>>>>>>>>>> MaxReceivedMessageSize = FIVE_MEGABYTES, >>>>>>>>>>>> >>>>>>>>>>>> // 5 >>>>>>>>>>>> megs, >> >>>>>>>>>>>> MaxBufferPoolSize = FIVE_MEGABYTES, >> >>>>>>>>>>>> MaxBufferSize = FIVE_MEGABYTES, >> >>>>>>>>>>>> ReaderQuotas = new XmlDictionaryReaderQuotas >> >>>>>>>>>>>> { >> >>>>>>>>>>>> MaxArrayLength = FIVE_MEGABYTES, >> >>>>>>>>>>>> MaxDepth = FIVE_MEGABYTES, >> >>>>>>>>>>>> MaxStringContentLength = >>>>>>>>>>>> FIVE_MEGABYTES, >> >>>>>>>>>>>> MaxNameTableCharCount = >>>>>>>>>>>> FIVE_MEGABYTES, >> >>>>>>>>>>>> MaxBytesPerRead = FIVE_MEGABYTES >> >>>>>>>>>>>> } >>>>>>>>>>>> >>>>>>>>>>>> }) >>>>>>>>>>>> >>>>>>>>>>>> .Register(AllTypes.FromAssemblyContaining<IAuthenticationService>() >>>>>>>>>>>> .Where(type => >>>>>>>>>>>> type.Name.EndsWith(SERVICE_SUFFIX)) >>>>>>>>>>>> >>>>>>>>>>>> .WithService.FirstInterface() >>>>>>>>>>>> .Configure(r => >>>>>>>>>>>> NameService(r).LifeStyle.Transient), >>>>>>>>>>>> >>>>>>>>>>>> Component.For<IServiceBehavior>() >>>>>>>>>>>> >>>>>>>>>>>> .ImplementedBy<ServiceDebugBehavior>() >>>>>>>>>>>> .DependsOn(new >>>>>>>>>>>> { >>>>>>>>>>>> >>>>>>>>>>>> IncludeExceptionDetailInFaults = true, >>>>>>>>>>>> >>>>>>>>>>>> HttpHelpPageEnabled = true, >>>>>>>>>>>> }), >>>>>>>>>>>> >>>>>>>>>>>> Component.For<IServiceBehavior>() >>>>>>>>>>>> >>>>>>>>>>>> .ImplementedBy<ServiceMetadataBehavior>() >>>>>>>>>>>> .DependsOn(new >>>>>>>>>>>> { >>>>>>>>>>>> >>>>>>>>>>>> HttpGetEnabled = true >>>>>>>>>>>> }), >> >>>>>>>>>>>> Component.For<IServiceBehavior>().ImplementedBy<UnitOfWorkBehavior>()); >>>>>>>>>>>> } >> >>>>>>>>>>>> #endregion >> >>>>>>>>>>>> private static ComponentRegistration<object> >>>>>>>>>>>> NameService(ComponentRegistration<object> registration) >>>>>>>>>>>> { >>>>>>>>>>>> var implementation = >>>>>>>>>>>> registration.Implementation; >>>>>>>>>>>> >>>>>>>>>>>> registration.Named(implementation.Name.Substring(0, >>>>>>>>>>>> implementation.Name.Length - SERVICE_SUFFIX.Length) >>>>>>>>>>>> .ToLowerInvariant() + >>>>>>>>>>>> ".svc"); >>>>>>>>>>>> return registration; >>>>>>>>>>>> } >>>>>>>>>>>> } >> >>>>>>>>>>>> But when I upload one I get everyone's second favorite wcf >>>>>>>>>>>> exception: >> >>>>>>>>>>>> The formatter threw an exception while trying to deserialize the >>>>>>>>>>>> message: There was an error while trying to deserialize parameter >>>>>>>>>>>> http://tempuri.org/:Data. The InnerException message was 'There >>>>>>>>>>>> was an >>>>>>>>>>>> error deserializing the object of type System.Byte[]. The maximum >>>>>>>>>>>> array length quota (16384) has been exceeded while reading XML >>>>>>>>>>>> data. >>>>>>>>>>>> This quota may be increased by changing the MaxArrayLength >>>>>>>>>>>> property on >>>>>>>>>>>> the XmlDictionaryReaderQuotas object used when creating the XML >>>>>>>>>>>> reader. Line 1, position 26406. >> >>>>>>>>>>>> Is the wcf facility ignoring my DefaultBinding when using the >>>>>>>>>>>> "look no >>>>>>>>>>>> config" method? Or am I doing something else wrong? >> >>>>>>>>>>>> -- >>>>>>>>>>>> You received this message because you are subscribed to the Google >>>>>>>>>>>> Groups "Castle Project Users" group. >>>>>>>>>>>> To post to this group, send email to >>>>>>>>>>>> [email protected]. >>>>>>>>>>>> To unsubscribe from this group, send email to... >> >> read more » > > -- > You received this message because you are subscribed to the Google Groups > "Castle Project Users" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/castle-project-users?hl=en. > -- You received this message because you are subscribed to the Google Groups "Castle Project Users" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/castle-project-users?hl=en.
