C# 通过代理web服务重复调用web服务-性能
下面是我的场景,我有一个夜间批处理作业,它将记录插入第三方系统/数据库。所有这些导入调用都通过我创建的代理服务进行路由,这主要是因为我的夜间批处理作业由于防火墙而无法直接连接到第三方服务 因此,每次作业运行我导入10000条记录。我建立到我的代理服务的连接,其中代理服务建立到第三方web服务的静态引用/连接。现在(不要笑),我为代理服务中的每个记录建立连接。这意味着,我在代理服务中有10000个“OpenConnection”和“CloseConnection”方法调用来完成这1个作业的运行。我每天做两次这项工作 我的问题是,如果我在第一次web服务调用上建立连接,但在第一次调用时没有关闭连接,那么后续的web服务调用是否会重新使用现有连接(因为它是静态的)?或者它会用第三方服务重新创建另一个会话 如果这样做有效(将连接保持打开状态以供后续调用),那么如何在作业完成时关闭连接,以便释放托管(或非托管)资源?我不想在我自己的web服务中添加一个名为“CloseConnection”的方法 除此之外,我们的服务器每晚都会自动重置IIS,如果当时连接仍然打开,它会正确处理我的连接吗 很抱歉,这里有很多问题,只是想寻找一种“最佳实践”方法来完成我加快这一过程的任务 我将尝试给出一个代码示例,下面是批处理作业代码:C# 通过代理web服务重复调用web服务-性能,c#,.net,web-services,C#,.net,Web Services,下面是我的场景,我有一个夜间批处理作业,它将记录插入第三方系统/数据库。所有这些导入调用都通过我创建的代理服务进行路由,这主要是因为我的夜间批处理作业由于防火墙而无法直接连接到第三方服务 因此,每次作业运行我导入10000条记录。我建立到我的代理服务的连接,其中代理服务建立到第三方web服务的静态引用/连接。现在(不要笑),我为代理服务中的每个记录建立连接。这意味着,我在代理服务中有10000个“OpenConnection”和“CloseConnection”方法调用来完成这1个作业的运行。我
ws.EstablishConnection();
for (int counter = 0; counter < 10000; counter++)
{
ws.ImportRecord(myRecords[counter]);
}
ws.Dispose();
我的问题是,如果我在第一次web服务调用上建立连接,但在第一次调用时没有关闭连接,那么后续的web服务调用是否会重新使用现有连接(因为它是静态的)
如果是静态的,将使用相同的对象。但你不会获得太多的速度。小心,因为“打开”连接可能会超时
或者它会用第三方服务重新创建另一个会话
Web服务是“无会话的”,每个调用都将在它自己的会话中
如果这样做有效(保持连接打开以供后续调用),
当我的工作完成后,如何关闭连接以便释放我的
托管(或非托管)资源?我不想添加一个方法
在我自己的名为“CloseConnection”的web服务中
您的连接对象是静态的。。。如果不显式调用“closeConnection”,则无法关闭连接
除此之外,我们的服务器每晚都会自动重置IIS
根据,如果该连接当时仍处于打开状态,是否会进行处理
我的连接正确吗
“池空闲”超时可能会在设置夜间基本IIS之前结束。垃圾收集器将处理您这边使用的所有内存。第三方可能从未收到close()请求,但一定会在一段时间后关闭连接
在您的情况下,您可以做的最好的事情是实现一个web服务方法来接收MyReccord数组,这样可以节省大量时间
[WebMethod]
public static void ImportRecord(MyRecord[] myRecords)
{
try
{
OpenConnection();
for (int counter = 0; counter < myRecords.Length; counter++)
{
3rdPartyWS.ImportRecord(myRecords[counter]);
}
}
finally
{
CloseConnection();
}
}
[WebMethod]
公共静态无效导入记录(MyRecord[]myRecords)
{
尝试
{
OpenConnection();
for(int counter=0;counter
更好的情况是,如果可能的话,请您的第三方实现一个web方法来接收对象数组或文件
Web服务循环非常慢,您不应该这样做。谢谢@Guish“您的连接对象是静态的。。。如果不显式调用“closeConnection”,就无法关闭连接,是否可以在这里实现某种Dispose方法?“小心,因为“打开”连接可能会超时。”我遗漏了一些代码,在我的web服务的OpenConnection()方法中,我检查_3rdParyWS是否已经实例化并连接,如果没有,那么它将重新建立连接。在我当前的设置中,它每次都会重新建立。因此,如果我在最后不调用CloseConnection()方法,它是否会看到_3rdParyWS已经实例化并连接,然后跳过该步骤?我考虑过这样做,但是我得到了每个单独的导入调用的响应/错误代码返回值以及导入的状态。我想我也可以这样做,只需将ImportDocumentResult对象更改为数组,而不是单个实例。我看看我能不能让它工作。谢谢你的帮助!如果您的连接对象被声明为“静态”,那么它将为应用程序池中的所有对象共享。您的第三方合作伙伴可能会限制打开连接的最大数量。保持连接打开将“使用”最大连接数的1。您应该始终关闭连接以保持干净,但连接会在特定超时后自动关闭。重用相同的“静态”连接对象不应使用新连接。
[WebMethod]
public static void ImportRecord(MyRecord[] myRecords)
{
try
{
OpenConnection();
for (int counter = 0; counter < myRecords.Length; counter++)
{
3rdPartyWS.ImportRecord(myRecords[counter]);
}
}
finally
{
CloseConnection();
}
}