Silverlight 4 Ria服务超时问题

时间:2011-02-02 16:55:19

标签: silverlight wcf entity-framework timeout wcf-ria-services

我正在从我的Silverlight客户端拨打我的DomainService,通常需要大约2分钟。我需要将端点的超时值扩展到5分钟才能安全,但它似乎忽略了设置,我找不到原因。以下是我在客户端创建DomainContext的方法:

MyDomainContext context = new MyDomainContext();
((WebDomainClient<MyDomainContext.IMyDomainServiceContract>)context.DomainClient).ChannelFactory.Endpoint.Binding.ReceiveTimeout = new TimeSpan(0, 5, 0);
context.Search(_myParms, p =>
    {
      if (p.HasError)
      {
        // Handle errors
      }

       // Should take about 2 min. to get here, but times out before          
     }, null);

我尝试过设置ReveiveTimeout和SendTimeout,但我总是在1分钟内得到错误。

有人能告诉我我做错了吗?

编辑:这是我得到的确切错误:

  

{System.Net.WebException:远程服务器返回错误:NotFound。 ---&GT; System.Net.WebException:远程服务器返回错误:NotFound。      在System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)      在System.Net.Browser.BrowserHttpWebRequest。&lt;&gt; c_ DisplayClass5.b _4(Object sendState)      在System.Net.Browser.AsyncHelper。&lt;&gt; c_ DisplayClass2.b _0(Object sendState)      ---内部异常堆栈跟踪结束---      在System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod,Object state)      在System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)      at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)}

我还测试过以确保它不是我服务中的东西。目前,我只是让我的服务运行一段时间。再一次,我在一分钟内得到了这个错误。

谢谢,

-Scott

3 个答案:

答案 0 :(得分:2)

你应该实现MyDomainContex类的部分方法OnCreated()。

样品:

public partial class TestDomainContext
{
    partial void OnCreated()
    {
        var proxy = (WebDomainClient<Test.Server.Services.TestDomainContext.ITestDomainServiceContract>)this.DomainClient;
        proxy.ChannelFactory.Endpoint.Binding.SendTimeout = new TimeSpan(0, 5, 0);
    }

答案 1 :(得分:1)

这个问题是Silverlight的一个难点。

我更喜欢这样的扩展方法而不是创建精细的部分类。

请在此处查看解决方案: http://blogs.msdn.com/b/kylemc/archive/2010/11/03/how-to-change-the-request-timeout-for-wcf-ria-services.aspx

如果使用棱镜,可按如下方式注射:

_unityContainer.RegisterType<SurveyModuleContext>(new InjectionFactory(c => CreateSurveyContext()));



    private object CreateSurveyContext()
    {
        var context = new SurveyModuleContext();
        context.ChangeWcfSendTimeout(new TimeSpan(0, 10, 0));
        return context;
    }


public static class DomainContextExtensions
{
    public static void ChangeWcfSendTimeout(this DomainContext context,
                                            TimeSpan sendTimeout)
    {
        PropertyInfo channelFactoryProperty =
          context.DomainClient.GetType().GetProperty("ChannelFactory");
        if (channelFactoryProperty == null)
        {
            throw new InvalidOperationException(
              "There is no 'ChannelFactory' property on the DomainClient.");
        }

        ChannelFactory factory = (ChannelFactory)channelFactoryProperty.GetValue(context.DomainClient, null);
        factory.Endpoint.Binding.SendTimeout = sendTimeout;
    }
}

您可以在此屏幕截图中看到该解决方案确实有效。 (2m 1s)致电

using firebug network request and response 2m 1s.

答案 2 :(得分:0)

是否是托管域服务的服务器端Web应用程序的请求超时?检查运行服务的Web应用程序或应用程序池的设置。