2016-05-20 10 views
0

公開サイトのページにアプリケーションの部分があります。 そのアプリでは、ユーザーが認証されるとJSOM呼び出しが正常に機能します。 匿名モードでは、アプリケーション部分を含むページのリロード後にのみ動作します。最初のロード時には、私はこのエラーメッセージが表示されます:サーバーはJSOMコールの403(FORBIDDEN) http://app-4e3210d8daa297.abc.com/MyList/_vti_bin/client.svc/ProcessQueryJSOMは、ページの最初の読み込み時に匿名モードでアプリケーションでの呼び出しを拒否します(読み込みが解決します)。

エラーハンドラの状態で応答し、「未定義」エラーを返す:

は、リソースのロードに失敗しましたメッセージ。

しかし、私はページをリロードするか、(javascriptコードを使って)app-part自体をリロードすれば動作します。

ページの最初の読み込み時にJSOM呼び出しが禁止されるのはなぜですか?これをどうすれば解決できますか?

+0

スクリプトを試してみたり、何度も試してみましたか?あなたのスクリプトはいつ始まりますか? – Nils

+0

スクリプトは、いくつかのsharepoint javascriptファイルとdomがロードされるのを待ちます。この問題を解決するには、jsom呼び出しのエラーハンドラでエラーをキャッチし、それを含むiframeのURLを変更してアプリケーションをリロードします(ループを避けるために&reload = trueを追加します)。これは迅速かつ汚れた修正のように感じる。 – Cyril

+0

あなたのコードでconsole.logを使用する場合は、開発者コンソールが開いているときのみIEでのみ動作します。それ以外の場合は、コードをキャンセルします。 – Nils

答えて

0

これは一時的にこの問題を解決するための迅速な修正ですが、より良い方法があると確信しています。

//error handler of the jsom call that fails 
    function onErrorLoadList(data, error, errorMessage) { 
     console.log("Could not complete cross-domain call: " + errorMessage); 
     // in anonymous mode, for the first load of the app 
     // the JSOM calls fail and errorMessage is undefined 
     if (typeof errorMessage == 'undefined') { 
      // we will reload the app by adding reload=true in the url 
      // if it fails again, we won't do it to avoid a loop 
      if (!location.href.match(/reload=true/)) { 
       console.log("The app reloads."); 
       location.href = location.href + "&reload=true"; 
      } 
     } 
    } 
関連する問題