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

Wcf 当您对响应不感兴趣时,使用对webservice的异步调用,wcf,Wcf,我使用对Web服务的调用来唤醒处理一些图像的进程。 这个过程需要10分钟,所以我不希望asp.net客户端等待 我所做的只是对服务进行一个简单的异步调用来启动处理 但看起来ConvertToubeService服务并不需要启动。 ConvertToSubeService是一种工作流服务。我从另一个工作流服务的活动中调用它。 我确信代码能够到达ConvertToSubeseService的异步调用 public sealed class CallProcessingAsync : CodeActi

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

我所做的只是对服务进行一个简单的异步调用来启动处理

但看起来ConvertToubeService服务并不需要启动。 ConvertToSubeService是一种工作流服务。我从另一个工作流服务的活动中调用它。 我确信代码能够到达ConvertToSubeseService的异步调用

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())
        {

        }
    }
}
公共密封类CallProcessingAsync:CodeActivity
{
//定义字符串类型的活动输入参数
公共不一致等角图像路径{get;set;}
public InArgument SaveImageDirectoryPath{get;set;}
公共InArgument ImageName{get;set;}
//如果活动返回值,则从CodeActivity派生
//并从Execute方法返回值。
受保护的覆盖无效执行(CodeActivityContext上下文)
{
//获取文本输入参数的运行时值
ConvertToCubeService.ServiceClient=新建ConvertToCubeService.ServiceClient();
ConvertToCubeService.ConvertToCubeFaces参数=新建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+=新事件处理程序(client_ConvertToCubeFacesCompleted);
converttosubefacesasync(param);//调用异步服务器来完成这项工作
使用(var db=new panonestEntities())
{
var p=db.Panoramas.Where(x=>x.ImageName.Equals(param.ImageName)).First();
p、 Status=“已调用处理。等待”;
db.SaveChanges();
}
}
无效客户端\u ConvertToCubeFacesCompleted(对象发送方,ConvertToCubeService.ConvertToCubeFacesCompletedEventArgs e)
{
使用(var db=new panonestEntities())
{
}
}
}

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

我认为更好的方法不是在客户端执行异步操作,而是在服务器端执行,因为当您忽略响应时,您甚至不知道调用是否已到达服务器

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


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

实际上,web服务器是作为Windows工作流服务实现的。所以我认为它做了类似的事情。但问题是,我调用了异步方法,但服务没有启动..明白了,这是有道理的。您可能希望提供有关如何尝试启动该服务的信息。对该服务的异步调用是在另一个工作流服务的CodeActivity中完成的。所以实际上我有一个服务呼叫另一个,只是为了唤醒它。这就是我使用异步调用的原因,因为我对ConvertToSubeseService服务的返回值不感兴趣是的,我理解。但是,当调用服务时,您有两种返回值:1)信息,即呼叫已成功传输并到达服务器;2)操作的实际返回值。我说,当您使用异步模式服务器端时,最好等待您能得到的第一个。