如何从单向(激发并忘记)ASP.NET Web服务调用捕获异常

如何从单向(激发并忘记)ASP.NET Web服务调用捕获异常,asp.net,web-services,Asp.net,Web Services,我正在调用标记为单向的ASP.NET Web服务。我将调用web服务的代码包装在一个try-catch块中,但它没有捕获web服务引发的异常。当我通过在浏览器中输入url单独测试webservice时,它会抛出一个错误,但由于某种原因,异常不会发送到调用代码。下面是示例代码 /// <summary> /// Summary description for WebService /// </summary> [WebService(Namespace = "http://

我正在调用标记为单向的ASP.NET Web服务。我将调用web服务的代码包装在一个try-catch块中,但它没有捕获web服务引发的异常。当我通过在浏览器中输入url单独测试webservice时,它会抛出一个错误,但由于某种原因,异常不会发送到调用代码。下面是示例代码

/// <summary>
/// Summary description for WebService
/// </summary>
[WebService(Namespace = "http://mycompany.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class TestWebService : System.Web.Services.WebService
{
    [SoapDocumentMethod(OneWay = true)]
    [WebMethod(Description="Start a long running process.")]
    public void LongRunningProcess()
    {
        //do some long process
    }
}

//calls proxy class method
TestWebService testWebService = new TestWebService();
testWebService.Timeout = Timeout.Infinite;
testWebService.Credentials = CredentialCache.DefaultCredentials;
testWebService.Url = <url> //the web service url
testWebService.LongRunningProcess()
//
///WebService的摘要描述
/// 
[WebService(命名空间=”http://mycompany.com/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[ToolboxItem(假)]
公共类TestWebService:System.Web.Services.WebService
{
[SoapDocumentMethod(单向=真)]
[WebMethod(Description=“启动长时间运行的流程”。)]
公共void LongRunningProcess()
{
//做一些漫长的过程
}
}
//调用代理类方法
TestWebService TestWebService=新建TestWebService();
testWebService.Timeout=Timeout.Infinite;
testWebService.Credentials=CredentialCache.DefaultCredentials;
testWebService.Url=//web服务Url
testWebService.LongRunningProcess()

任何帮助都将不胜感激。

我相信你做不到

声明一个方法的全部要点是一种方法,即将其标记为fire并忘记,客户机不必等待调用该方法


一旦服务器解析了请求,通常在它实际调用该方法之前,它就会返回http 202,此时客户端将继续

请注意,上面没有显示调用代码的try-catch块,但我通过添加它进行了测试,调用webservice.Correct时不会引发异常。根据定义,单向方法无法向调用方报告有关调用成功或失败的任何信息。我认为这是单向webservice调用的一个限制。相反,最好异步调用它并实现回调方法来捕获任何异常,除非有更好的方法在用户单击按钮时从web界面执行长时间运行的流程。我考虑在单独的线程上运行该进程,但不确定如果用户中途关闭浏览器会发生什么。所以我所做的是将用户输入存储在数据库中,并通过调度器在后台调用web服务来执行它。此过程大约需要15分钟才能完成。用户可以稍后检查状态