Silverlight中的WCF - 如何设置更改默认超时1分钟

时间:2013-06-27 04:08:04

标签: wcf silverlight timeout

我有一个我在Silverlight项目中连接的WCF服务。服务需要做的任务需要一分钟(这很好),但我收到一个错误。我通过代理(当您添加服务引用时由dev studio创建)与它进行通信

  

The HTTP request to 'http://localhost/ImporterService.svc' has exceeded the allotted timeout. The time allotted to this operation may have been a portion of a longer timeout.

(其中ImporterService是我的服务)

我已经阅读了过去3天关于增加以下内容的所有帖子。

receiveTimeout="00:10:00"
sendTimeout="00:10:00"
openTimeout="00:10:00"
closeTimeout="00:10:00"

没有任何效果,1分钟后仍然超时!

好的,所以在生成的ServiceReferences.ClientConfig文件中,我已在以下位置添加了值

<configuration>
  <system.serviceModel>
  <bindings>
   <basicHttpBinding>
   <binding name="BasicHttpBinding_ImporterService" maxBufferSize="2147483647"
      receiveTimeout="00:10:00"
      sendTimeout="00:10:00"
        openTimeout="00:10:00"
        closeTimeout="00:10:00"
        maxReceivedMessageSize="2147483647">
        <security mode="None" />
        </binding>
        ....

此超时似乎发生在客户端(例如,我可以通过在服务代码中添加1分钟的睡眠来实现)

问题1 所以,在我的情况下,我只需要改变客户端。

无论如何都在web.config中 在web.config中,我添加了块

inside the existing <basicHttpBinding> as shown below


 ><basicHttpBinding>
    ><binding name="downloadBinding" maxReceivedMessageSize="2000000" maxBufferSize="2000000">
    ><readerQuotas maxArrayLength="2000000" maxStringContentLength="2000000" />
    ></binding>
    >    
    ><binding name="BasicHttpBinding_IImporterService" maxBufferSize="2147483647"
    >receiveTimeout="00:10:00"
    >sendTimeout="00:10:00"
    >openTimeout="00:10:00"
    >closeTimeout="00:10:00"
    >maxReceivedMessageSize="2147483647">
    ><security mode="None" />
    ></binding>
    >    
    ></basicHttpBinding>            
    ></bindings>

注意我使用名称BasicHttpBinding_IImporterService(其他帖子使用了随机名称,它们在客户端和服务器上甚至不相同!例如。

I also have <httpRuntime executionTimeout set to a huge value.

超时不会增加。现在还是1分钟。

所以,大问题

1. What an I doing wrong, am I putting these settings in the wrong place?
2. Is it just client side I need to do
3. Perhap it can be done in code if these config settings don't work

例如,在我使用它的地方,我使用

进行实例化
  

ImporterServiceClient importerService = new ImporterServiceClient("*", new >EndpointAddress(ServicePath));

我知道还有很多其他帖子,但是,大多数只是包含属性,而不是确切地设置它们,所以显然我的位置错了?

非常感谢任何帮助。我想做的就是增加一个超时(在代码,配置,任何实际工作的地方)!

提前感谢任何可以提供帮助的人 皮特

2 个答案:

答案 0 :(得分:1)

在web.config中无需添加任何超时数据。 将超时设置添加到SL应用程序。 当您将ServiceRefferences添加到项目中时,VisualStudio必须生成文件

ServiceReferences.ClientConfig

我有这个配置

<?xml version="1.0" encoding="utf-8"?>

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>

            <binding name="BasicHttpBinding_IEventsService" closeTimeout="01:59:00"
                receiveTimeout="01:59:00" sendTimeout="01:59:00" maxBufferSize="2147483647"
                maxReceivedMessageSize="2147483647">
                <security mode="None" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://mySite/MyService.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IEventsService"
            contract="EventService.IEventsService" name="BasicHttpBinding_IEventsService" />

    </client>
</system.serviceModel>

您可以根据需要设置超时参数。 希望这有帮助。

答案 1 :(得分:0)

@Std_Net,非常感谢您的回复。我发布这篇文章后不久,我设法让它发挥作用(虽然我已经挣扎了几天!)

以上就是我添加超时设置的原因,由于某种原因,设置只是没有抓住我。我找到了一个exampole,其中这些是在代码中设置的,当我尝试时,它们终于出现了。

你是对的,我不需要在服务器站点(web.config)上做任何事情,只有客户端。

只是让任何其他人都需要知道这一点(即像我这样的WCF新手)这里至少对我有用......

private readonly ImporterServiceClient m_importerService; ...

m_importerService = new ImporterServiceClient("*", new EndpointAddress(ServicePath));            
const int timeoutMinutes = 15;
m_importerService.Endpoint.Binding.OpenTimeout = TimeSpan.FromMinutes(timeoutMinutes);
m_importerService.Endpoint.Binding.SendTimeout = TimeSpan.FromMinutes(timeoutMinutes);