【问题标题】:How to invoke async activity in UIPath如何在 UIPath 中调用异步活动
【发布时间】:2018-09-21 14:36:37
【问题描述】:

我正在尝试在 UIPath 中执行自定义 asyncCodeActivity。添加了包,传递了所有数据,但是 UIPath 只是在到达自定义活动时挂起并且不会抛出任何异常/或停止。我尝试使用 CodeActivity 和 AsyncCodeActivity 创建类库 - 我的活动应该进行几个 APICalls 但我得到的结果它只是在它到达我的自定义活动时停止并且不会转到下一个。是否有任何示例如何为 UIPath 创建异步自定义活动?当我尝试在 UIpath 之外对其进行测试时,我的类库工作正常。将不胜感激。
我使用 CodeActivity 的类库:

public class AddInvoice : CodeActivity
 {       
    [Category("Input")]
    [RequiredArgument]
    public InArgument<string> PickupZip { get; set; }         

    [Category("Output")]
    [RequiredArgument]
    public OutArgument<String> Output { get; set; }

    public async Task<string> ApiTest(CodeActivityContext context)
    {            
        try
        { 
        var origin = await GoogleAPIWrapper.GetAddressByZip(PickupZip.Get(context));          
        string PickupAddress;
        string DeliveryAddress;
        var inv = new IList();
        if (origin.StatusId >= 0)
        {                
            invoice.PickupCity = origin.Locality;                
            invoice.PickupState = origin.AdminLevel1; 
        }
        else
        {               
            invoice.PickupCity = null;               
            invoice.PickupState = null;   
        }             
        var tkn = token.Get(context);
        var client = new HttpClient();
        HttpClientHandler handler = new HttpClientHandler();
        client = new HttpClient(handler, false);
        client.BaseAddress = new Uri("http://test.test.com/");
        client.DefaultRequestHeaders.Add("Authorization", "Bearer " + tkn);
        StringContent content = new StringContent(JsonConvert.SerializeObject(inv), Encoding.UTF8, "application/json");
        var response = await client.PostAsync("api/insert/", content);
        var resultContent = response.StatusCode;
            Output.Set(context, resultContent.ToString());
    }
        catch (Exception e)
        {                
            Output.Set(context, e.ToString());
        }
        return "ok";
}
    protected override void Execute(CodeActivityContext context)
    {
        try
        {
            string result = ApiTest(context).GetAwaiter().GetResult();
        }
        catch (Exception e)
        {
            Output.Set(context, e.ToString());
        }
    }      


    public class IList
    {            
        public string PickupState { get; set; }            
        public string PickupCity { get; set; }           
    }

}  

【问题讨论】:

    标签: uipath


    【解决方案1】:

    从 CodeActivity 派生的类默认是同步的。由于 UiPath 基于 Windows 工作流,因此从 AsyncCodeActivity 类派生应该可以工作。

    您没有明确要求它,但由于您实际上是在调用 Web 服务,因此请查看 Web 活动包,尤其是 HTTP Request。这也带有 JSON 反序列化。您可以找到有关 Web 服务集成的更多信息 here,例如(免责声明:我是作者)。

    【讨论】:

    • 谢谢,我尝试使用 AsyncCodeAcitiviy,当我在 VS 中运行它时它可以正常工作,但是当我从 UIPath 调用它时,它只是在执行时卡住并且不会转到下一行。由于我正在执行多个 API 调用,因此我希望通过调用一个自定义活动来组合不同的类并完成任务。需要考虑发出几个单独的 HTTP 请求。谢谢
    • 感谢分享。您可能需要考虑将其作为一个问题发布在他们的论坛上:forum.uipath.com/c/rpa-dev/issues
    • @Ika,我面临一个问题,即我正在使用 AsyncCodeActivity 执行网络请求并取回结果。 AsyncCodeActivity 实现在 Visual Studio 2017 中运行良好,但是当我在 UiPath 中部署相应的 nuget 包时,调用网络请求时执行停止。您是否解决了 UiPath 中的阻塞问题?如果有,怎么做?
    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多