views:

4305

answers:

5

Calling through to my Silverlight Enabled WCF-Service in my silverlight application, occasionally users get timeouts. Whats the easiest way to boost the time allowed by the service client for a response?

The exact exception thrown is: System.TimeoutException: [HttpRequestTimedOutWithoutDetail]

Thanks

+4  A: 

This can be set in the node of the ServiceReference.ClientConfig file in the silverlight app.

DeletedAccount
+1  A: 

This can be set, but there is an upper limit that is defined by the underlying HTTP library (I think its five minutes). Note that using a higher value will fall back to what the upper limit is. Also, be aware that you may need to configure the timeout on the server as well.

Shawn Wildermuth
A: 

rather that chaning the timeout i thing youshoudl implement a timer based call back to the server from silverlight so the session doesn't expire - this would eliminate the overhead of longer timeout for all your application

ashish jaiman
+1  A: 

The accepted answer here did not work for me. Instead I had to cast the base channel into an IContextChannel, and set the OperationTimeout on that.

To do that, I had to create a new file with a partial class, that matched the name of the ServiceReference. In my case the I had a PrintReportsService. Code is below.

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace RecipeManager.PrintReportsService 
{
    public partial class PrintReportsClient : System.ServiceModel.ClientBase<RecipeManager.PrintReportsService.PrintReports>, RecipeManager.PrintReportsService.PrintReports 
    {
        public void SetOperationTimeout(TimeSpan timeout)
        {
            ((System.ServiceModel.IContextChannel)base.Channel).OperationTimeout = timeout;
        }


    }
}

Then when I create the client, I do the following:

        PrintReportsService.PrintReportsClient client = new RecipeManager.PrintReportsService.PrintReportsClient();
        client.SetOperationTimeout(new TimeSpan(0, 4, 0));

That did it for me! More info is available here, but the code snippet in this post doesn't compile.

Rick Arthur
A: 

I fixed this by enabling compatibility mode in IE

Matthew Hall