长时间运行的WCF操作 - 在basicHttpBinding中增加receiveTimeout不起作用

时间:2015-09-04 10:58:59

标签: c# wcf basichttpbinding

我们的应用程序公开了由客户端的SOA中间件调用的IIS托管的WCF服务(我认为它是Oracle SOA套件,如果这很重要)。该操作将原始数据文件导入我们的数据库。

服务方法的主体是

public void ImportAssenze(XmlElement import)
    {
        System.Threading.Tasks.Task.Run(() => LongRunningProcess());
    }

该进程在另一个任务中运行,因为前一段时间,在该服务中进行其他操作,出现了其他客户端超时问题,因此我现在将此模式用于所有操作;在此之前,它只是对LongRunningProcess()的调用。  所以现在实际的Web服务调用持续约2秒(我也在soapUI中看到它),然后导入操作在后台进行。

方面问题:因为同意在操作完成时不需要通过回调通知客户端,该方法返回void。 因此客户端无法看到wsdl的操作的异步性质:这是一个糟糕的设计吗?

问题是,对于某些源文件,该进程超过10分钟不活动超时,因此Session_End事件被触发,并且我的进程的某些内部状态被无可挽回地损坏。我希望这个特定的文件是一种“最坏的情况”,平均运行时间应该是~5分钟,但是其他操作将来可能会出现同样的问题,所以这需要解决。

对于服务配置,web.config没有写入任何内容,因此该服务使用basicHttpBinding绑定运行所有默认值。合同是

    [ServiceContract(Namespace = ProcessiHelper.Namespace)]
public interface IProcessi_7044852
{
    [OperationContract]
    void ImportAssenze(XmlElement import);
}

我找不到该链接,但此处的回答问题建议增加inactivityTimeout上的reliableSessionreceiveTimeout上的binding(另一个提及的地方)它是here

    <binding name="Processi_7044852Binding" receiveTimeout="00:00:30">
      <reliableSession enabled="true" inactivityTimeout="00:00:30"/>
    </binding>

reliableSession无法使用basicHttpBinding。我尝试只增加第二个,所以我创建了一个service节点

    <services>
  <service name="Archimede.HRSuite.TurniArc.Processi_7044852" behaviorConfiguration="">
    <endpoint binding="basicHttpBinding" bindingConfiguration="Processi_7044852Binding" contract="Archimede.HRSuite.TurniArc.IProcessi_7044852"/>
  </service>    
</services>

binding节点超时30秒

 <basicHttpBinding>
            <binding name="Processi_7044852Binding" receiveTimeout="00:00:30">
    </binding>
</basicHttpBinding>

但我没有看到任何不同;会话在十分钟后被清除。 我也试过receiveTimeout="infinite"而没有运气。

This link似乎与我的问题相符,而Marco周末的最后一个回复(他似乎是在WCF团队中?)证实了这种奇怪的行为,但没有进一步的反馈。

有没有解决方法?我不知道是否可以更改绑定并强制客户端同步其代理。此外,如果我将配置更改为

<wsHttpBinding>
    <binding name="Processi_7044852Binding" receiveTimeout="00:00:30">
      <reliableSession enabled="true" inactivityTimeout="00:00:30"/>
    </binding>
  </wsHttpBinding>

<endpoint binding="wsHttpBinding" [..]一起,由于某种原因在soapUI中调用服务不起作用,并且该过程甚至没有启动,所以我不确定如何/如果我可以做出替代方案工作

谢谢(抱歉这篇长篇文章!)

0 个答案:

没有答案