我的SOAP Web服务有一个奇怪的问题。
对于某些背景信息 - 我们有大约100-110个具有多个终端的不同位置,在某些时候可能会触及此特定端点 - 让我们称之为 Endpoint1 。 Endpoint1 的作用是为我们的某个合作伙伴调用Web服务,然后在我们自己的系统中调用几个数据库查询,以验证扫描的项目实际上位于它所说的位置,一些防欺诈代码等与手头的问题不太相关。对 Endpoint1 的呼叫通常需要5-20秒,具体取决于从呼叫该位置的互联网连接,通常是该范围的较低端。
问题在于,当两个或多个位置同时或几乎同时呼叫 Endpoint1 时,某些位置收到的响应不正确 - 具体而言,它们应该是应该响应的去其他地方之一。
E.g。
由于我们在所有地点广泛部署了系统更新,因此过去一周发生过多次。当我们准确记录 Endpoint1 发送给合作伙伴网络服务的内容时,有时发送的标识符将完全不正确 - 即它会将位置A记录为已发送标识符 21345589 尽管位置A的日志显示已发送 11235813 。其他时候,它会显示为 11235813 ,但响应将是来自合作伙伴网络服务的 21345589 的信息。
此SOAP服务部署在Windows Server 2012 R2上的IIS8.5中。它是用.NET v4.5编写的,但应用程序池.NET CLR版本是4.0。只有一台服务器正在运行此代码 - 没有其他服务器或负载平衡。
以下是 Endpoint1 代码的相关开头部分。
[WebMethod(EnableSession = true, Description = "Endpoint1")]
public service.Endpoint1ResponseObject Endpoint1(string param1, string param2, string Identifier, string param3,string locationNo,
string param4, string param5, string param6, string param7, string param8,string param9,
string param10, string param11)
{
...
service.Endpoint1ResponseObject response = new service.Endpoint1ResponseObject();
try
{
response.SubObj1 = new service.SubObj1();
response.SubObj2 = new service.SubObj2();
response.SubObj3 = new service.SubObj3();
response.SubObj4 = new service.SubObj4();
if (//Identifier length/format validation)
{
if (CheckParams(param1, param2))
{
Functional fn = new Functional();
locationNo = fn.CheckValidLocationNo(locationNo);
response.subObj4.Property1 = "";
Partner.PartnerRequest(locationNo, Identifier.Trim(), param3, param4, param5, param6, ref response);
...etc.
所有响应子对象和响应对象本身都在 Endpoint1 的开头实例化 - 在包含此函数的主类中没有静态变量或类级变量。类定义是" service"的一部分。 class - 这些都是公开的,不是静态的。有时,只有 subObj4 的信息是错误的(合作伙伴网络服务信息),有时所有四个子对象都有不正确的信息。我还没有注意到一种模式。
如果需要更多信息,我将很乐意提供我所能提供的服务 - 此时已有几个不同的人参与了此代码。
将应用程序池设置为具有5个工作线程的Web园(不起作用)
从Endpoint1删除所有日志记录到文件。理论是,一次写入一个文件的多个请求导致了这些问题。这是不久之前所以我不确定问题是否再次发生,因为它取决于我们在任何给定时间点在我们的位置发生了多少交易(更新:这也不起作用)