Web服务性能问题

时间:2008-12-30 14:37:59

标签: c# web-services asmx

我有一个简单的asmx Web服务,只需要将一些信息记录到事务数据库中。但是对于客户来说是暂时的。更新数据库的调用只调用了1个存储过程,我不相信它可以进一步优化以获得更好的性能。我已经简化为只使用log4net记录运行,然后通过更新数据库的单独进程读取登录。

我想知道是否有更好的方法来做到这一点。我想知道是否有办法让我的代码做类似的事情:

public bool method(...)
{
  LogRun(...)

  Asynchronously call method to insert transaction

  return true;  
}

5 个答案:

答案 0 :(得分:0)

您可能想要尝试的一件事是Tracing

答案 1 :(得分:0)

编辑:我对BackgroundWorker的看法不对。所以我把它变成了Thread版本,经过测试。

如果您希望异步完成工作,可以学习如何启动另一个线程。

public class Service1 : System.Web.Services.WebService
{

    [WebMethod]
    public void Log(int foo, int bar)
    {
        Thread a = new Thread(new ThreadStart(delegate()
        {
            // Do some processing here
            // For example, let it sleep for 10 secs
            Thread.Sleep(10000);
        }));
        a.Start();
    }
}

如果Thread.Sleep(10000)行在Log方法本身中,则Log方法需要10秒才能完成处理。但是,使用 Thread a ,Log方法将在调用后立即返回。

另请注意,使用这种异步调用方式,如果插入操作完成与否,则没有简单的方法来保证调用客户端。

答案 2 :(得分:0)

如果无法进一步优化查询,则可以增加timeout value for your SQL client,假设您可能正在使用SQL服务器。

在使用Web服务的客户端上,如果您希望客户端继续执行其他操作,则可以异步使用该方法。当Web方法完成时,它将触发一个事件。如果您认为它可能有所帮助,那么有一个很好的小例子you can read here

答案 3 :(得分:0)

虽然您可以在webmethod中查看异步操作,但是您正在使用asp.net中的线程和/或线程池,它已经在进行多线程操作。虽然技术上可行,但您也可能无意中抢夺资源系统,因为httpruntime管理资源以便为您的服务提供服务。

写入本地log4net文件并在脱机例程中导入该数据比实时日志记录,异步或其他方式具有更高的可用性,因为您的SQL Server可以脱机并且您的服务仍然可用。如果除了日志记录之外不需要sql server,则更喜欢将db操作保留在web方法之外。

答案 4 :(得分:0)

如果它只是对客户端的即时消息,您的Web服务可能只是将详细信息添加到队列并返回到客户端。我已经使用MSMQ来实现类似于你所描述的内容。它不会修复数据库超时,但它确实会从客户端发送错误消息。