之前的工作中涉及到了一个问题,要利用MS crm的web resource去调用一个第三方的web api, 实现过程中遇到了一个问题:
没用办法使用ajax去跨越domain, 也就是cross-domain restrictions。
做了一些调查后发现常用的方法有三种:
1. 使用jsonp 而不是使用json format
jsonp 也就是 json with padding, 把ajax message的datatype改为jsonp就可以最简单的调用。
更多的细节参考这个链接
http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html
使用jsonp后, 我的web resource 也无法成功调用第三方的web api. 可能是web api并不支持jsonp格式的request.
2. 在api 服务端添加cors
cors 也就是 cross origin resource sharing. 在web api可以通过添加cors 允许一些 cross orign request.
enable cors in webb api参考下面的链接
http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
这个解决方案相比JSONP更加的安全也更加的可控, 但是悲剧的是这些第三方的API有一些是我们自己hold, 于是我们可以很方便的添加cors. 但是另外有一些api需要和对方沟通,于是对于这些api, 只能采用第三个方案。
3.放弃ajax,使用server side code.
在server side code 调用api是没有cross domain block的, 对于CRM来说, server side code的方案包括:
a. 用CRM SDK提供的DLL创建一个asp.net的web application.
b. 使用plugin。
C. 使用custom workflow
所以最终的解决方案是第二混合第三,当然,当你使用ajax去调用CRM的restful service或者rest api是不会遇到这个问题的。只用第三方的api你才需要考虑这些方案。
后记: 最近公司要重构整个CRM的架构,所以比较忙,忙完这段要开始把自己学习CRM MVP们的博客的心得结合自己的工作经验开始更新。