2017-03-24 7 views
0

wwwrootフォルダにあり、ネットワーク内でローカルアクセス可能なMVC Web API(IISでホストされています)を持っています。http://mylocalapi:133/api/Values/Getと私は結果を得る。ネットワーク外部の外部サイトから内部MVC Web APIを許可する方法

私はhttp://example.orgという外部サイトを持っていますが、同じhttp://mylocalapi:133/api/Values/Getを実行したいと思います。

どちらも外部に面するサイトだけでなく、内部APIサイトは、同じサーバー上でホストされている(それは例えば、外部ネットワークのサードパーティベンダー異なる場合があります)私がで設定CORSを持って

このように私のAPI:

XMLHttpRequest cannot load http://mylocalapi:133. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.org' is therefore not allowed access.

[EnableCors(origins: "http://example.org", headers: "*", methods: "*")]

は、しかし、私は次のエラーを取得しておきます私がいることを、私がしようとしないとき

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <httpRedirect enabled="true" destination="http://mylocalapi:133" exactDestination="true" /> 
    </system.webServer> 
</configuration> 

だから、それを回避、私は私の外部のサイトに仮想ディレクトリ(APICALLS)を作成し、ローカルIISサイトを指しますweb.configファイルを作成しましたこのようにAPIにアクセス:http://example.org/APICALLS/api/Values/Getが、私は次のエラーを取得する:

XMLHttpRequest cannot load http://mylocalapi:133. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.org' is therefore not allowed access. 

私が間違っているのは何とどのように私はこの問題を解決することができます。

+0

外部サイトからローカルホストにWebリクエストを送信しようとしましたが、間違っていますか?もしそうなら、あなたはできません。 – ibubi

+0

@ibubi仮想ディレクトリでさえ? – Si8

答えて

0

JavaScriptは、あなたの外で、エンドユーザーのマシン上で、クライアント側を実行してあなたは、JavaScriptのから内部のみのサイトにアクセスすることはできません登録方法でのあなたのWebApiConfigクラスのコードの下に

config.EnableCors(); 
+0

私はそれがすでに私のAPI .csファイルにヘッダーがあるので、それはすでに行われている。 – Si8

1

を追加します。内部ネットワーク。 JavaScript経由でAPIを呼び出す唯一の方法は、1)APIを外部ネットワークに公開する方法か、2)外部サイト内にプロキシを作成する方法です。

プロキシは、基本的に外部アクセスを提供するアクションまたはアクションであり、その呼び出しを内部APIに変換します。最も簡単で、あなたは基本的に何かに反応する単一のアクションを持つことができます:アクションは、クエリ文字列にこの情報を取得し、HttpClientのようなものを経由して、あなたの内部APIにリクエストを作成することを使用する

https://foo.com/api?endpoint=/internal/api/endpoint/&someParam=foo 

。しかし、このアプローチでは内部API全体がかなり公開されるため、その時点で外部に移動することもできます。より良いアプローチは、JavaScriptを使用して作成する必要がある特定の内部API呼び出しに対して特定のエンドポイント(アクションメソッド)を作成することです。

UPDATE

それはあなたのコンテキストなしでここに任意の実際の方向性を与えることは困難です。ウィジェットのリストを返す内部APIエンドポイントがあり、このウィジェットのリストをAJAX経由で取得したいとします。

public async Task<ActionResult> GetWidgets() 
{ 
    // fetch widgets from internal API via HttpClient 
    return Json(widgets, JsonRequestBehavior.AllowGet); 
} 

はその後、あなたのAJAXは、ボンネットの下に内部APIを呼び出して、あなたのウェブサイト上でこのアクションメソッドのURLを呼び出します。あなたのような何かが必要になります。

+0

返事をありがとう。 JavaScriptがAPIにヒットしていないか、間違っていますか?私は内部サイトを指すIIS内の仮想ディレクトリを持っています。技術的には、Javascriptはサーバー上の仮想ディレクトリにしか当たらず、ローカルサイトにアクセスするよう指示します。 #1はどのように達成するのですか?私は、APIフォルダーからファイル/フォルダーをコピーし、それを外部サイトで作成したサブフォルダーに移動しようとしましたが、別のエラーが発生します。 – Si8

+0

それ以上のこと...これを実現するには、「JavaScriptを使用して作成する必要がある特定の内部API呼び出しに対して、特定のエンドポイント(アクションメソッド)を作成する方が良いでしょう」。ありがとうございました – Si8

+0

あなたが現在やっていることは、リクエストが入ってくるときにリクエストを*リダイレクトしようとしていることです。リダイレクトすると、 'Location'ヘッダで応答が送られます。クライアントは、指定された場所に新しい要求を発行する責任があります。これは内部のみであるため、まだ実行できません。 –

関連する問題