当您对响应不感兴趣时​​,请对webservice使用异步调用

时间:2011-12-05 15:00:05

标签: wcf

我使用对Web服务的调用来唤醒处理某些图像的进程。 这个过程需要10分钟,所以我不希望asp.net客户端等待它。

我所做的是对服务进行简单的异步调用以启动处理。

但看起来ConvertToCubeService服务似乎无法启动。 ConvertToCubeService是一个工作流服务。我从另一个工作流服务的活动中调用它。 我确信代码会重新调用ConvertToCubeService的异步调用。

public sealed class CallProcessingAsync : CodeActivity
{
    // Define an activity input argument of type string
    public InArgument<string> EquirectangularImagePath { get; set; }
    public InArgument<string> SaveImageDirectoryPath { get; set; }
    public InArgument<string> ImageName { get; set; }
    // If your activity returns a value, derive from CodeActivity<TResult>
    // and return the value from the Execute method.
    protected override void Execute(CodeActivityContext context)
    {
        // Obtain the runtime value of the Text input argument
        ConvertToCubeService.ServiceClient client = new ConvertToCubeService.ServiceClient();
        ConvertToCubeService.ConvertToCubeFaces param = new ConvertToCubeService.ConvertToCubeFaces();

        var apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;


        param.EquirectangularFilePath=apPath+context.GetValue(this.EquirectangularImagePath);
        param.imageName = context.GetValue(this.ImageName);
        param.SaveCubicFacesDirectory = apPath + context.GetValue(this.SaveImageDirectoryPath);
        client.ConvertToCubeFacesCompleted += new EventHandler<ConvertToCubeService.ConvertToCubeFacesCompletedEventArgs>(client_ConvertToCubeFacesCompleted);
        client.ConvertToCubeFacesAsync(param);//call async the server to do the work
        using (var db = new panonestEntities())
        {
            var p = db.Panoramas.Where(x => x.ImageName.Equals(param.imageName)).First();
            p.Status = "Called processing. wait";
            db.SaveChanges();
        }
    }

    void client_ConvertToCubeFacesCompleted(object sender, ConvertToCubeService.ConvertToCubeFacesCompletedEventArgs e)
    {
        using (var db = new panonestEntities())
        {

        }
    }
}

2 个答案:

答案 0 :(得分:0)

您不应该在Web服务器上运行需要10分钟的事情。你应该为此编写一个Windows服务。您可以使用一个简单的Web服务,将记录放入表中以触发Windows服务执行其工作

答案 1 :(得分:0)

我认为更好的方法不是做异步客户端而是服务器端,因为当你忽略响应时,你不会知道呼叫是否已经到达服务器。

我会以这种方式处理服务器操作,它会异步启动长时间运行的任务,然后快速返回。

客户端可以等待呼叫,并且可以确定呼叫已成功到达服务器并且操作已开始。