在MS Dynamics CRM Online中使用Azure托管WebApi

时间:2016-02-04 12:17:02

标签: azure asp.net-web-api dynamics-crm

我们正在使用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中引发错误,其中包含:拒绝访问

2 个答案:

答案 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);
        }
    });