2

クロスドメイン アクセスの問題があるようです。「Access-Control-Allow-Origin: *」を追加することを示しているいくつかのソリューションを見てきましたが、どこでこれを行うことができるかわかりません。

ハンドラーを作成する必要がありますか?

私はWCF Web APIを使用しています。

エラー: XMLHttpRequest はhttp://localhost:8081/Song/0を読み込めません。オリジンhttp://localhost:8080は Access-Control-Allow-Origin で許可されていません。

編集

これは、HTTP メソッドが PUT または DELETE の場合にのみ発生することに気付きました。GET または POST で正常にリクエストを作成できます。

私はjqueryを使用してリクエストを行っています。

$.ajax({
        url: Settings.RESTfulEndPointFor('Song/' + songID),
        type: 'DELETE',
        success: function (response) {
            callback(response);
        }
    });

理由はわかりませんが、これにより OPTIONS メソッド with Access-Control-Request-Method: DELETE が発生しているようです。

誰がこれを引き起こしているのか知っていますか?

どんな助けでも大歓迎です。

4

6 に答える 6

4

AJAX呼び出しを介してWCFRESTfulサービスに接続するときにこの問題が発生しました

私のJavaScriptはこれでした:

var GetData= function(){

    var data;
    $.ajax({
        url:  this.server + "/data",
        async: false,
        type: "GET",
        success: function (success) {
            data = success;
        }
    });
    return data;

};

私のサービスエンドポイントはこのコードで開かれました

ServiceHost host = new ServiceHost(new MyService());
host.Open();

重要なデータはすべてApp.configファイルに保存されているため、この修正のためにそのファイルを変更する必要はありませんでした。

応答メッセージが送信される前に、どこかにヘッダーを追加する必要があることはわかっていました。

検索とハッキングを行った後、ServiceHostオブジェクトのAuthorizationプロパティを見つけました。Authorizationプロパティは、ServiceAuthorizationBehaviorクラスのインスタンスであり、そのオブジェクトには、ServiceAuthorizationManagerクラスのインスタンスであるServiceAuthorizationManagerというプロパティがあります。

ServiceAuthorizationManagerから継承する新しいクラスを作成し、それをServiceHostインスタンスのAuthorization動作のServiceAuthorizationManagerプロパティに設定することで、サービスへのすべての呼び出しをインターセプトできます。

これが私のクラスの実装方法です

public class MyServiceAuthorizationManager : ServiceAuthorizationManager
{
protected override bool CheckAccessCore(OperationContext operationContext)
{

    HttpResponseMessageProperty prop = new HttpResponseMessageProperty();
    prop.Headers.Add("Access-Control-Allow-Origin", "*");
    operationContext.OutgoingMessageProperties.Add(HttpResponseMessageProperty.Name, prop);

    return true;
}
}

次に、ServiceHostオブジェクトを宣言した直後(ホストを開く前)にこの行を追加します

host.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager();

これを実行し、サービスを再構築して実行した後、エラーメッセージが表示されなくなりました。やったー!

最後に、ServiceHostクラスがRESTfulサービスではなくSOAP/WSDLサービス用に設計されていることを説明した記事を読みました。RESTfulサービスの場合、WebServiceHostオブジェクトを使用する必要があります。

それで

ServiceHost host = new ServiceHost(new MyService());
host.Open();

になります

WebServiceHost host = new WebServiceHost(new MyService());
host.Open();

次のアセンブリへの参照を追加する必要があります。

  • System.ServiceModel.Web

お役に立てれば。

出典:

于 2012-10-29T17:58:27.937 に答える
1

通常、これを応答のヘッダーに入れます。したがって、このような他のヘッダー値を変更/挿入するヘッダーに入れます

header('Access-Control-Allow-Origin: *) //change it according to however header is  set in wcf , since this is php syntax

ポイントは、応答にこのヘッダーが含まれている必要があることです。

于 2011-06-10T15:19:42.803 に答える
1

The request you are seeing with the OPTIONS method and an Access-Control-Request-Method: DELETE header is called a "preflight request". The CORS specification requires this for requests with methods that have side effects (like DELETE) to ensure the resource is ok with the request.

Check out this section of the spec >> http://www.w3.org/TR/cors/#cross-origin-request-with-preflight0

Unfortunately I don't know how to make this type of request work with wcf web api.

于 2012-01-27T03:43:22.997 に答える
0

まず、ほとんどのWebブラウザーでは、クロスドメインの制限を実際に回避する方法はありません。ほとんどの場合、「accept」ヘッダーを変更することさえできません。したがって、JSONPを使用する必要があります。JSONPは、クロスドメインサービスからJSONデータを取得する方法ですが、JavaScriptスニペットの形式で返されます。これは許可されています。コールバック関数名をサービスに提供すると、クロスドメインサービスは、実際のJSON値がパラメーターとしてコールバック関数に埋め込まれた単純なJavaScriptを返します。これは、WCF WebApi(プレビュー6)を使用して行うのが非常に簡単です。NuGetを使用してVS2010にインストールします。インストールしたら、ここで詳細を確認してください。

于 2012-01-25T07:30:12.317 に答える
0

私が作成しました

AllowCrossDomainRequestHandler : DelegatingChannel 

応答ごとに、このヘッダーを登録しています。

response.Headers.Add("Access-Control-Allow-Origin", "*"); 
于 2011-06-11T17:02:10.333 に答える
0

次の応答ヘッダーを使用してこれを機能させました。

res.writeHead(200, {
        'Content-Type': 'text/plain',
        'Access-Control-Allow-Methods': 'DELETE, POST, GET, OPTIONS',
        'Access-Control-Allow-Origin': '*'
    }); 
于 2011-12-26T19:07:03.393 に答える