我们的应用程序公开了由客户端的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
上的reliableSession
和receiveTimeout
上的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中调用服务不起作用,并且该过程甚至没有启动,所以我不确定如何/如果我可以做出替代方案工作
谢谢(抱歉这篇长篇文章!)