38

RESTFUL WCF サービス アプリケーションにポスト リクエストを送信しています。POSTFiddler を介してリクエストを正常に送信できます。

ただし、jQuery Ajax メソッドを使用してこれを行うと、関数は次を Chrome 開発者コンソールに返します。

OPTIONS http://www.example.com/testservice/service1.svc/GetData 405 (Method Not Allowed) jquery.min.js:6

しかし、ログの 1 秒後:

Object {d: "You entered 10"} testpost.html:16

これが教えてくれるのは、jQuery がOPTIONSリクエストを送信して失敗した後POST、期待されるデータを返すリクエストを送信していることです。

私のjQueryコード:

$.ajax() {        
type: "POST", //GET or POST or PUT or DELETE verb 
    url: "http://www.example.com/testservice/service1.svc/GetData", // Location of the service      
    data: '{"value":"10"}', //Data sent to server
    contentType:"application/json",
    dataType: "json", //Expected data format from server    
    processdata: false,
    success: function (msg) {//On Successfull service call   
        console.log(msg);
    },
    error: function (xhr) { console.log(xhr.responseText); } // When Service call fails             
});

jQuery バージョン 2.0.2 を使用しています。

このエラーが発生する理由についてのヘルプは、非常に役立ちます。

4

5 に答える 5

66

あなたのコードは実際には、通常の ではなく、クロスドメイン (CORS)リクエストを作成しようとしていPOSTます。

つまり、最新のブラウザーは、HTML ページと同じドメイン内のサービスへの Ajax 呼び出しのみを許可します。

例:のページは、 のようなhttp://www.example.com/myPage.htmlにあるサービスのみを直接リクエストできます。サービスが他のドメインにある場合、ブラウザーは (ご想像のとおり) 直接呼び出しを行いません。代わりに、CORS リクエストを作成しようとします。http://www.example.comhttp://www.example.com/testservice/etc

簡単に言うと、CORS リクエストを実行するには、ブラウザで次のことを行います。

  • 最初にOPTIONターゲット URL にリクエストを送信します
  • そして、それに対するサーバーの応答に、CORS 要求を許可するための適切なヘッダー (ヘッダーの 1 つ) が含まれている場合にのみ、ブラウズは呼び出しを実行します (HTML ページが同じドメインにある場合とほぼ同じ方法で)。 OPTIONAccess-Control-Allow-Origin
    • 期待されるヘッダーが来ない場合、ブラウザーは単純にあきらめます (あなたがそうしたように)。

それを解決する方法は?最も簡単な方法は、サーバーで CORS を有効にする (必要なヘッダーを有効にする) ことです。

サーバー側でアクセスできない場合は、別の場所から Web サービスをミラーリングし、そこで CORS を有効にすることができます。

于 2013-06-27T01:22:09.690 に答える
4

フィルターで必要なヘッダーを作成することもできます。

@WebFilter(urlPatterns="/rest/*")
public class AllowAccessFilter implements Filter {
    @Override
    public void doFilter(ServletRequest sRequest, ServletResponse sResponse, FilterChain chain) throws IOException, ServletException {
        System.out.println("in AllowAccessFilter.doFilter");
        HttpServletRequest request = (HttpServletRequest)sRequest;
        HttpServletResponse response = (HttpServletResponse)sResponse;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type"); 
        chain.doFilter(request, response);
    }
    ...
}
于 2014-11-07T14:15:25.080 に答える