1

プログラミング環境は次のとおりです。 - Windows 8 デスクトップ。- WCF サービス; - Excel 2013 オフィス アプリ; - 同じマシンで実行されている WCF サービスと Excel オフィス アプリの両方。- Office アプリが WCF サービスに対して ajax 呼び出しを行います。問題が発生する JavaScript コード (office アプリで使用) は次のとおりです。

function F() {
  $.support.cors = true;
  $.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "http://localhost:5000/<service>/<method>",
    data: '{<my data>}',
    dataType: "json",
    success: ...
    error: ...
   });
}

ここに問題があります。Excel 2013 アプリから WCF サービスを呼び出すと、「転送なし」エラーが発生します。次の使用例を特定できました。1) これは、スタンドアロンの Excel 2013 インスタンスを実行し、[挿入] Excel メニューからアプリを挿入した場合にのみ発生します。2) VS2012 からアプリを実行すると、問題なく WCF サービスを呼び出すことができます。(ところで、WCF サービスは同じマシンで実行されます。Excel 2013 アプリから行っている要求は ajax です。) 3) (2) と同じ場合。アプリは WCF 呼び出しを行うことができます。次に、Excel の [挿入] メニューからアプリのインスタンスも挿入します。この場合、挿入されたアプリ インスタンスを使用して WCF 呼び出しを実行しようとすると、(1) と同じエラーが発生します - 「トランスポートなし」。

インターネットで検索を行ったところ、私の問題は、発信しようとしている通話がクロスドメイン通話であるという事実に関連している可能性があることがわかりました。(ところで、私はjQueryコードをデバッグしましたが、呼び出しは実際にはクロスドメインのものです)。提案された解決策は、呼び出しの前に jQuery プロパティの 1 つを設定することでした: "jQuery.support.cors = true;"。Excel 2013 アプリ コードでそれを行いましたが、問題は解決しませんでした。次に、jQuery コードで呼び出しを追跡したところ、次のことがわかりました。

1) アプリが VS2012 から実行されると、jQuery は 2 つのトランスポート オブジェクトを作成します: (1) クロスドメイン リクエスト用と (2) クロスドメイン リクエストが XMLHttpRequest を介してのみ許可される場合。アプリから WCF 呼び出しが行われると、jQuery は 2 番目のトランスポートを使用し、呼び出しは成功します。

2) アプリが Excel 2013 の [挿入] メニューから挿入されると、WCF 呼び出しの前に、jQuery はクロスドメイン要求用にトランスポート オブジェクトを 1 つだけ作成します。次に、jQuery はそのトランスポート オブジェクトを使用できないと「判断」し、リクエストは「トランスポートなし」エラーで失敗します。

なぜこれが起こるのか、問題をどのように解決できるのか考えていますか?

4

0 に答える 0