我们正在使用MS Dynamics Crm 2016 Online,我们需要从客户端使用Azure Hosted WebApi。我们正在尝试使用ajax调用来获取数据..相同的代码在MS Dynamics Crm之外适用于我们,但在Dynamics Crm中我们正在获得Access denied错误。我们在webapi中启用了CORS,但我们仍然遇到了这个问题。看起来它与Dynamics CRM有关,但我们无法找到原因和解决方案。
以下是在MS Dynamics CRM之外工作的示例代码
$.ajax({
url: 'http://myaccountapi.azurewebsites.net/api/Account',
type: 'POST',
data: 'testaccount',
contentType: "application/json",
success: function(data) {
processData(data);
},
error: function (error) {
alert(error.statusText);
}
});
但是同样的代码会在 CRM中引发错误,其中包含:拒绝访问。
答案 0 :(得分:1)
因此,您有orgName.crmX.dynamics.com
的网页试图致电myaccountapi.azurewebsites.net
。这不是CRM问题。
您正在发出可能导致访问被拒绝消息的跨站点请求 - 因为,我猜,您尚未在WebApi应用程序中启用CORS。
您可以在以下位置查看完整示例:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api。
启用CORS
现在让我们在WebService应用程序中启用CORS。首先,添加CORS NuGet 包。在Visual Studio中,从“工具”菜单中选择“库包” Manager,然后选择Package Manager Console。在包管理器中 在控制台窗口中,键入以下命令:
Install-Package Microsoft.AspNet.WebApi.Cors
此命令安装最新的软件包并更新所有依赖项, 包括核心Web API库。用户-Version标志来定位 特定版本。 CORS包需要Web API 2.0或更高版本。
打开文件App_Start / WebApiConfig.cs。将以下代码添加到 WebApiConfig.Register方法。
using System.Web.Http; namespace WebService { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // New code config.EnableCors(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } } }
接下来,将[EnableCors]属性添加到TestController类:
using System.Net.Http; using System.Web.Http; using System.Web.Http.Cors; namespace WebService.Controllers { [EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")] public class TestController : ApiController { // Controller methods not shown... } }
答案 1 :(得分:0)
由于在加密连接上访问CRM Online,您还需要使用SSL访问外部资源。只需更改您的网址即可使用https,您应该好好去:
$.ajax({
url: 'https://myaccountapi.azurewebsites.net/api/Account',
type: 'POST',
data: 'testaccount',
contentType: "application/json",
success: function(data) {
processData(data);
},
error: function (error) {
alert(error.statusText);
}
});