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.

Reply via email to