由于跨域资源共享 (CORS),主机 Web 上的 SP.ClientContext 失败

Posted

技术标签:

【中文标题】由于跨域资源共享 (CORS),主机 Web 上的 SP.ClientContext 失败【英文标题】:SP.ClientContext on host web failed because of Cross Origin Resource Sharing (CORS) 【发布时间】:2016-04-17 11:58:29 【问题描述】:

我开发的 SharePoint 托管应用程序(SharePoint 应用程序)有问题。 SharePoint 版本是 2013。

应用网址为:http://app-12a34567bcde8f.sharepoint.local/sites/DEV/HelloWorld 主机地址为:http://dev.local/sites/DEV

示例脚本是用JSOM编写的:

var clientContext = new SP.ClientContext('http://dev.local/sites/DEV');
var contextSite = clientContext.get_site();
clientContext.executeQueryAsync(function(e) 
    console.log('Success', e);
, function(e) 
    console.log('Error', e);
);

控制台中的信息消息。

SEC7118: XMLHttpRequest for http://dev.local/sites/DEV/_api/contextinfo required Cross Origin Resource Sharing (CORS).
SEC7119: XMLHttpRequest for http://dev.local/sites/DEV/_api/contextinfo required CORS preflight.

控制台中的错误消息。

SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied.

Console.Log 结果:

"Error"
[object Object] $1C_0: true, $1F_0: Object ..., $1o_0: null, $1p_0: null, $1r_0: Object ..., $1u_0: null, $1X_0: false, $29_0: "javascript ...", $2A_0: null, $2I_0: false, $2N_0: 180000, $2T_0: null, $8_0: null, $F_0: Object ..., $F_1: null, $N_1: Object ..., $v_0: null, $w_0: "http://dev...", $x_0: null

我无法理解这一点,因为带有 REST 和 SP.RequestExecutor 的方法也不起作用。 -1003 App Web is not deployed for this app's request url http://dev.local.

示例:

var executor = new SP.RequestExecutor('http://dev.local');
executor.executeAsync(
    url: "http://dev.local/_api/search/query?querytext='*'&refinementfilters='contenttype:equals (\"SPFolder\")'",
    method: 'GET',
    headers: 'application/json; odata=verbose',
    success: function(a) 
        console.log('Finish', a);
    ,
    error: function(data, errorCode, errorMessage) 
        console.log('Error', data, errorCode, errorMessage);
    
);

而 jQuery 说“401 UNAUTHORIZED”:

$.ajax(
    crosDomain: true,
    url: "http://dev.local/_api/search/query?querytext='*'&refinementfilters='contenttype:equals (\"SPFolder\")'",
    success: function(e) 
        console.log('Success', e);
    ,
    error: function(e) 
        console.log('Error', e);
    , dataType:'json'
);

我只想执行一个搜索查询并正常使用 SP.ClientContext。

在此先感谢您的帮助!

【问题讨论】:

【参考方案1】:

看看这篇文章:Access SharePoint 2013 data from add-ins using the cross-domain library。或者,您可以尝试在托管 dev.local/sites/DEV 的 IIS 上设置 Access-Control-Allow-Origin: *。

【讨论】:

【参考方案2】:

我需要使用 SP.ProxyWebRequestExecutorFactory(跨域)来让我的查询工作。这个网站上有一个例子。 Explain when to use WebRequestExecutorFactory & SP.ProxyWebRequestExecutorFactory

【讨论】:

以上是关于由于跨域资源共享 (CORS),主机 Web 上的 SP.ClientContext 失败的主要内容,如果未能解决你的问题,请参考以下文章

CORS跨域资源共享漏洞初探

跨域访问CORS探究

跨域请求

跨域请求

跨域请求

在使用 Swagger 开发的 NodeJS 上的 ExpressJS 框架中启用跨域资源共享 (CORS)