2013-04-18 26 views
3

C#ASP.NET 3.5执行Web服务方法,并立即返回

是否可以“发射后不管”的网络服务,是不是异步或单向的方法?

有一种方法返回一个值(经过一些处理后),我不需要。它被另一个组织(谁写了服务)使用。基本上,它只是通知用户x做了行动y。我只需要调用该方法并继续前进,而不必等待结果。

我尝试使用带有RunWorkerAsync的BackgroundWorker(),但该方法由于某种原因不会触发。我无法更改Web服务方法,因为我无法访问其代码。我应该使用BackgroundWorker,Invoke,ThreadPool,还有其他的东西吗?我不需要返回结果,我不需要知道它是否失败。基本上,调用方法,如果它的工作,很好。如果不是,我不想停止或减慢处理速度。

public static void Test() 
{ 
    var worker = new BackgroundWorker(); 
    worker.DoWork += Test2; 
    worker.RunWorkerAsync(new object[] {12345, "test"}); 
} 

private static void Test2(object sender, DoWorkEventArgs e) 
{ 
    // Write to log that we got into the method - does not 
    object[] args = e.Argument as object[]; 
    int num = Convert.ToInt32(args[0]); 
    string name = (string)args[1]; 
    // call web service method here.... 
} 
+0

这取决于您的网站架构。你怎么称呼你的服务?您是否每次创建wcf客户端代理的新实例?它是一个页面类字段(可能注入)?请添加缺少的代码。 – 2013-04-22 11:54:03

回答

-1

在Asysn/Sync wfc调用中有一个文档。 http://msdn.microsoft.com/en-us/library/ms734701.aspx

+0

-1他明确询问了不是异步或单向的Web服务调用。 – 2013-04-18 02:23:12

+0

为什么它被标记为wcf?异步http发布将适用于asmx调用。我以前做过这个会寻找一个例子。 – 2013-04-18 02:31:13

+0

你将不得不问问标签的人,而不是我。也许他没有使用遗留代码(ASMX)。 – 2013-04-18 02:32:49

1

Intsead使用后台工作,你可以尝试要求,顾名思义就是WCF单向以下

public static void Test() 
    { 
     System.Threading.ThreadPool.QueueUserWorkItem(delegate 
     { 
      Test2(new object[] { 12345, "test" }); 
     }); 
    } 

    private static void Test2(object data) 
    { 
     // Write to log that we got into the method - does not 
     object[] args = data as object[]; 
     int num = Convert.ToInt32(args[0]); 
     string name = (string)args[1]; 
     // call web service method here.... 
    } 
1

的功能。在客户端完全实现所需的行为是不可能的。

IIS默认情况下(一个公共的WCF服务主机)被允许终止任何由关闭的连接启动的进程。这意味着客户必须在整个过程中保持连接(实际上意味着等待结果)。此外,请求可能会超时,并且“火灾和遗忘”进程将被终止。

如果您只想在客户端占用的资源减到最少,同时请求正在运行,我会异步运行请求。如果您只能访问.net < = 4.0,那么最简单的方法是使用“添加服务引用”选项生成异步调用(我的意思是APM async和NOT async/await/TPL async),并勾选“生成异步方法“选项。

你将不得不学习APM编程模型(这是非常讨厌的)。

或者,您可以在单独的线程上运行WCF调用。但请注意,这需要大量额外资源。