C# 每隔X小时从PostgreSql函数调用Web服务(asmx)

C# 每隔X小时从PostgreSql函数调用Web服务(asmx),c#,web-services,postgresql,asmx,postgresql-9.3,C#,Web Services,Postgresql,Asmx,Postgresql 9.3,我在PostgreSql中有一个函数: do $$ declare arow record; foo varchar(50); begin for arow in select name from person s(a) loop foo := arow.name; RAISE NOTICE 'Calling asmx(%)', foo; end loop; end; $$; 我想在我打印通知的那一行调用一

我在PostgreSql中有一个函数:

do $$
  declare
    arow record;
    foo varchar(50);
  begin
    for arow in
      select name from person s(a)
    loop
      foo := arow.name;
      RAISE NOTICE 'Calling asmx(%)', foo;
    end loop;
  end;
$$;
我想在我打印通知的那一行调用一个用C#制作的Web服务(asmx)

可能吗?如果没有,有什么建议吗?

虽然可以从长时间运行的函数中执行此操作,但出于许多原因,这是一个糟糕的想法

相反,您应该在一个频道上
NOTIFY
,然后让
LISTEN
ing客户端守护程序接收通知并调用web服务

这本质上是一个相同的问题,就像:

  • 它浪费了一个完美的DB连接——当web服务调用发生时,DB进程不能做任何有用的事情
  • 如果web服务调用被卡住,您可能会遇到大量卡住的DB连接,从而导致严重的性能问题、连接池不足等
如果您决定必须直接从函数调用web服务,则需要使用PL/Perl、PL/python、PL/TCL、PL/Java或实现一个C函数来进行调用。您不能直接在PL/PgSQL中执行此操作,因为它没有TCP/IP、HTTP等支持(根据设计,它应该包含在数据库操作中,并且受到数据库安全模型的限制)。Pl/PgSQL函数可以用另一种语言调用一个函数。从该语言调用web服务就像从该语言中的任何其他函数调用它一样(除非您不能使用线程)

不过,请不要这样做。使用
收听
通知
。这就是他们在那里的目的



Re“每隔几个小时”一次:不要试图用DB函数来实现这一点。由于函数长时间运行的事务导致不可移动的行版本,这将导致性能问题。使用任务调度器/cron/pgagent/

大多数情况下,从数据库函数调用web服务都会导致性能问题,但我将照此处理。使用像plperl或plpython这样的语言,您可以调用任何东西。找出如何从命令行调用您的web服务,并使用perl或pythons库中的一个来进行系统调用。使用web服务调用,只有在给定问题中的信息时,您才能找到答案。如果您真的想沿着这条路走下去,或者您只是想看看是否有可能读取不受信任的plperl()