注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

微软MVP罗勇的博客

微软MVP罗勇,www.luoyong.me

 
 
 

日志

 
 

如何解决升级到Dynamics 365后通过Web API调用操作偶尔返回204的问题?  

2017-05-08 22:31:19|  分类: Q&A |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复255或者20170508可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me 。
升级到Dynamics 365  (版本1612,V8.2.0.749) 后发现,通过Web API调用有返回参数的操作(Action)有时候返回HTTP Status是204,而不是正常的200。 HTTP Status 等于204代表请求成功,但是没有返回内容。为了更好的说明问题,我这里做一个全局的操作来演示,这个操作的作用很简单,拿到服务器端的UtcNow时间并返回,这个有时候有用,因为你如果需要在前段通过JavaScript来设置日期时间的话,拿的是客户端的时间,有的人可能会改动客户端的时间导致问题。
这个操作需要一个自定义工作流活动,至于如何创建及注册自定义工作流活动请参考 Dynamics 365中自定义工作流活动获取的上下文分析及注意事项 ,我这里的自定义工作流活动用到的代码如下:

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
using System;
using System.Activities;

namespace CrmVSSolution.Workflow
{
    public class GetServerUtcNow : CodeActivity
    {
        [Output("服务器的UTC当前时间,yyyy-MM-dd HH:mm:ss")]
        public OutArgument<string> ServerUtcNow { get; set; }
        protected override void Execute(CodeActivityContext executionContext)
        {
            ITracingService tracingService = executionContext.GetExtension<ITracingService>();
            tracingService.Trace("进入自定义工作流活动CrmVSSolution.Workflow.GetServerUtcNow");
            ServerUtcNow.Set(executionContext, DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"));
            tracingService.Trace("离开自定义工作流活动CrmVSSolution.Workflow.GetServerUtcNow");
        }
    }
}


我创建的全局操作如下:
1. 实体选择无(全局)
2.定义了一个字符串类型的输出参数
3.第一个步骤调用前面包括一个输出参数的自定义工作流活动,获得服务器端的UtcNow
4.第二个步骤是一个分派值操作,将前面获取到的服务器端的UtcNow赋值给操作的输出参数。
如何解决升级到Dynamics 365后通过Web API调用操作偶尔返回204的问题? - 罗勇 - 微软MVP罗勇的博客
 
你可能会问,你为啥不用日期型的输出参数,如果我将工作流的运行时间赋值给日期型的输出参数会报如下的错误:Conversion from type 'CrmDateTime' to type 'Date' is not valid,呵呵。
如何解决升级到Dynamics 365后通过Web API调用操作偶尔返回204的问题? - 罗勇 - 微软MVP罗勇的博客

如果用Web API来调用的话,JavaScript代码如下:

    var clientUrl = Xrm.Page.context.getClientUrl();
    var reqUrl = clientUrl + '/api/data/v8.2/hw_getservertime';
    var req = new XMLHttpRequest();
    req.open('POST', encodeURI(reqUrl), false);
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.onreadystatechange = function () {
        if (this.readyState == 4) {
            req.onreadystatechange = null;
            if (this.status == 200) {
                Xrm.Utility.alertDialog(this.responseText);
                Xrm.Utility.alertDialog("通过Web API调用操作,获取到的当前服务器时间是:" + JSON.parse(this.responseText).UtcNow);
            }
            else if (this.status == 204) {
                Xrm.Utility.alertDialog("通过Web API调用操作,服务器返回204,调用成功但是没有返回值!");
            }
            else {
                var error = JSON.parse(this.responseText).error;
                Xrm.Utility.alertDialog("通过Web API调用操作,获取服务器时间出错。status=" + this.status + ";message=" + error.message);
            }
        }
    };
    req.send();


返回的结果我截图如下:
如何解决升级到Dynamics 365后通过Web API调用操作偶尔返回204的问题? - 罗勇 - 微软MVP罗勇的博客
 
如何解决升级到Dynamics 365后通过Web API调用操作偶尔返回204的问题? - 罗勇 - 微软MVP罗勇的博客

你会说这不是好好的吗?的确上面截图显示的是正常结果,但是我可以一万个肯定的告诉你,系统升级到Dynamics 365以后还是会偶尔抽风,返回的HTTP Status是204,然后拿不到操作的输出参数值。
如何解决这个问题?坐等,上Case,但是这是个偶发问题,怎么办?我观察到一个现象,那就是就算通过Web API调用操作返回的HTTP Status是204的时候,通过C#代码使用组织服务去掉好用操作,依然是好用的,能够拿到输出参数的值。那么再往前一步,如果我模拟这种方法呢?是不是就很稳定?我真的去证实了这个想法的可行性,那就是JavaScript通过SOAP终结点来调用操作,具体方法可以参考我的博文 通过JavaScript调用SOAP终结点执行实体消息 ,我这里直接上代码了(这里顺便鄙视下SDK中这个例子的DLL引用的版本还是7.0了,最好自己更新下):

    var requestMain = "<s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'>";
    requestMain += "<s:Body>";
    requestMain += "<Execute xmlns='http://schemas.microsoft.com/xrm/2011/Contracts/Services' xmlns:i='http://www.w3.org/2001/XMLSchema-instance'>";
    requestMain += "<request xmlns:a='http://schemas.microsoft.com/xrm/2011/Contracts'>";
    requestMain += "<a:Parameters xmlns:b='http://schemas.datacontract.org/2004/07/System.Collections.Generic' />";
    requestMain += "<a:RequestId i:nil='true' />";
    requestMain += "<a:RequestName>hw_getservertime</a:RequestName>";
    requestMain += "</request>";
    requestMain += "</Execute>";
    requestMain += "</s:Body>";
    requestMain += "</s:Envelope>";
    var req = new XMLHttpRequest();
    req.open("POST", clientUrl+ "/XRMServices/2011/Organization.svc/web", false);
    req.setRequestHeader("Accept", "application/xml, text/xml, */*");
    req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
    req.onreadystatechange = function () {
        if (this.readyState == 4) {
            req.onreadystatechange = null;
            if (this.status == 200) {
                var responseStr = this.responseText;
                Xrm.Utility.alertDialog("通过SOAP终结点调用操作,返回内容是" + responseStr);
                var searchedstr = responseStr.match(/XMLSchema"\>.+\<\/b:value\>/gm)
                if (searchedstr != null) {
                    Xrm.Utility.alertDialog("通过SOAP终结点调用操作,获取到的当前服务器时间是:" + searchedstr[0].substring(11, searchedstr[0].length - 10));
                }
            } else if (this.status == 204) {
                Xrm.Utility.alertDialog("通过SOAP终结点调用操作,服务器返回204,调用成功但是没有返回值!");
            }
            else {
                Xrm.Utility.alertDialog("通过SOAP终结点调用操作,获取服务器时间出错。status=" + this.status + ";responseText=" + this.responseText);
            }
        }
    };
    req.send(requestMain);


 结果如下:
如何解决升级到Dynamics 365后通过Web API调用操作偶尔返回204的问题? - 罗勇 - 微软MVP罗勇的博客

如何解决升级到Dynamics 365后通过Web API调用操作偶尔返回204的问题? - 罗勇 - 微软MVP罗勇的博客

都能拿到正确结果,但是通过SOAP终结点去调用十分稳定,目前我没有发现出错的,通过Web API代码简单解析的是JSON数据也简单,但是我的理解是Dynamics 365(v8.2)的稳定性不够,偶尔出问题。那性能?从F12的结果来看,不相上下,一般来说,这种请求和返回内容都不多的消息,使用SOAP终结点效率还高点。
如何解决升级到Dynamics 365后通过Web API调用操作偶尔返回204的问题? - 罗勇 - 微软MVP罗勇的博客
 
素格格新疆特产店--做最好新疆特产的搬运工。 
本店由博主的新疆老婆开设,搬运各种最好的新疆特产,是自用,送礼,年货,孝敬长辈特别是(岳)父母的首选!
素格格新疆特产店淘宝网址是 http://sugege.taobao.com 欢迎自助购买。
 如何解决升级到Dynamics 365后通过Web API调用操作偶尔返回204的问题? - 罗勇 - 微软MVP罗勇的博客

  评论这张
 
阅读(162)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017