1

JQuery ajax 関数を使用して呼び出している Web API があります。(Chrome RESTEasy 拡張機能を使用して) サービスを直接テストすると正常に動作しますが、JQuery ajax 関数を使用してサービスを呼び出すとエラーが発生します。ポート81で呼び出しています:

$.ajax({
   url: "http://127.0.0.1:81/api/people",
  data: JSON.stringify(personToCreate),
  type: "POST",
  contentType: "application/json;charset=utf-8",
  statusCode: {
     201: function (newPerson) {
        callback(newPerson);
     }
  },
  success: function (newPerson) {
     alert("New person created with an Id of " + newPerson.Id);
  },
  error: function (jqXHR, textStatus, errorThrown) {
     alert('Error. '+textStatus+'. '+errorThrown);
  }
});

...しかし、FireBug Lite を使用してトレースすると、ポート 82 から応答が返されます。

{"Message":"No HTTP resource was found that matches the request URI 'http://127.0.0.1:82/api/people'.","MessageDetail":"No action was found on the controller 'People' that matches the request."}

エラーは事実上、クロスサイト スクリプティングがブロックされているためだと思いますが、私の言いたいことがわかるなら、私は実際にはクロスサイト スクリプティングではありません。

他の誰かがこれに遭遇し、それを修正できましたか?

編集: ルーティング構成 (global.asax.vb) は次のとおりです。

RouteTable.Routes.MapHttpRoute(name:="DefaultApi", routeTemplate:="api/{controller}/{id}", defaults:=New With {Key .id = System.Web.Http.RouteParameter.Optional})

コントローラ:

Public Function PostValue(ByVal departmentid As Integer, ByVal emailaddress As String, ByVal firstname As String, ByVal lastname As String) As Guid
    Dim context As New WSMModelDataContext
    Dim bllPeople As New PeopleBLL(context)

    Return bllPeople.Create(firstname, lastname, emailaddress, departmentid)
End Function

デバッグすると、コントローラーを実行するまでには至りませんが、RESTEasy を介して呼び出すと、正しくルーティングされ、コントローラーが正常に実行されます。唯一の違いは、(正しく) 使用している RESTEasy を介して呼び出されたことです。

http://127.0.0.1:81 

しかし、何らかの理由でJQuery/ajax経由で呼び出された場合、使用しているようです

http://127.0.0.1:82.

価値があるのは、同じ方法で設定された GET 動詞を使用してみたところ、正常に動作し、期待される結果が返されるため、これは POST 動詞の使用に関係しているようです。

OK、私はちょうど別のことに気付きました。これは、ローカル開発に Azure エミュレーターを使用する Visual Studio 2012 クラウド プロジェクトです。ソリューションを実行すると、次の 2 行がログに表示されます。

Windows Azure Tools: Warning: Remapping public port 80 to 81 to avoid conflict during emulation.
Windows Azure Tools: Warning: Remapping private port 80 to 82 in role 'SimplicityWSM' to avoid conflict during emulation.

したがって、API が見つからない理由は、API が別のポートに移動されているが、メイン アプリケーション (ソリューション内のすべてのプロジェクトにある) が同じポートに残っているためであり、コードは、 api はアプリケーションと同じポートにあります。

解決方法はわかりませんが、これが根本的な原因のようです。

4

0 に答える 0