web-dev-qa-db-ja.com

servicestack REST APIおよびCORS

Servicestackフレームワークを使用してCORS RESTサービスを作成できるかどうかは誰でも知っていますか?

私は今、WCF RESTものに対して数日間私を攻撃してきました-まったく役に立たない。

ありがとう

46
user156888

CorsFeatureプラグインの使用

グローバルCORSサポートを有効にする

CorsFeatureを使用して、CORSヘッダーを Plugin にラップし、CORSサポートをServiceStackに簡単に追加できるようにしましたサービス。

通常、これで必要なのはこれだけです。

Plugins.Add(new CorsFeature());

デフォルト値を使用するもの:

CorsFeature(allowedOrigins:"*", 
    allowedMethods:"GET, POST, PUT, DELETE, OPTIONS", 
    allowedHeaders:"Content-Type", 
    allowCredentials:false);

デフォルトに一致する値はすべて省略できます。例えば。許可されるメソッドをGETおよびPOSTリクエストのみに制限したい場合は、次のようにします。

Plugins.Add(CorsFeature(allowedMethods:"GET, POST"));

すべてのOPTIONリクエストに対してCORSをグローバルに有効化

CorsFeature(または手動のグローバルヘッダー)が登録されたら、オプションですべてに対してCORSを有効にすることを選択できます[〜#〜]オプション[〜#〜] PreRequestフィルターを追加して、登録されているすべてのグローバルヘッダー(つまり、CorsFeatureのヘッダー)を発行し、すべてを短絡する[〜#〜] options [〜#〜]次のリクエスト:

this.PreRequestFilters.Add((httpReq, httpRes) => {
    //Handles Request and closes Responses after emitting global HTTP Headers
    if (httpReq.Method == "OPTIONS") 
        httpRes.EndRequest(); //add a 'using ServiceStack;'
});

CORSサービスごとのサポートを有効にする

上記のプラグインを使用する代わりに、ServiceStackでは、[EnableCors]Response Filter属性を使用して、サービスごとにCORSを有効にすることもできます これは上記と同じデフォルトです。例えば。 GETだけを有効にすることができますPOST上記のように:

[EnableCors(allowedMethods:"GET,POST")]
public class MyService : Service { ... }

CORSを手動で有効にする

ServiceStack の優れた点は、非常に柔軟でシンプルなコア上に構築されていることです。将来どのような新しいHTTPヘッダー/ステータスコードが存在するかを予測することは不可能であるため、すべてに対して厳密に型指定されたAPIを構築することは試みません。したがって、一般的なタスクを実行するための便利な動作を提供する一方で、必要なHTTP出力を構成できる柔軟なAPIも提供します。

グローバルHTTPヘッダーの設定

これは、AppHost構成でクロスオリジン共有をグローバルに有効にする方法です。

public override void Configure(Container container)
{
    //Permit modern browsers (e.g. Firefox) to allow sending of any REST HTTP Method
    base.SetConfig(new EndpointHostConfig
    {
        GlobalResponseHeaders = {
            { "Access-Control-Allow-Origin", "*" },
            { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" },
            { "Access-Control-Allow-Headers", "Content-Type" },
        },
    });
}

サービスでカスタムHTTPヘッダーを返す

これらのヘッダーはリクエストごとに送信されますが、特定のWebサービスに対して有効にすることもできます。たとえば、 Hello World Web Service を使用します。

public class Hello {
    public string Name { get; set; }
}

public class HelloResponse {
    public string Result { get; set; }
}

public class HelloService : IService 
{
    public object Any(Hello request)
    {
        var dto = new HelloResponse { Result = "Hello, " + request.Name };
        return new HttpResult(dto) {
            Headers = {
              { "Access-Control-Allow-Origin", "*" },
              { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" } 
              { "Access-Control-Allow-Headers", "Content-Type" }, }
        };
    }
}

上記は、すべてのHTTP動詞(GET、POSTなど)および組み込みのエンドポイント(JSON、XML、JSV、HTML、CSVなど)に自動的に接続されるWebサービスを開発するために必要なすべてのC#コードです。 SOAP 1.1/1.2-無料、設定や摩擦は必要ありません。チェックアウト 上記のWebサービスの実際の例

上記のエンドポイントに加えて、各サービスはJSONP(Ajaxアプリでクロスドメインサービスコールを有効にするもう1つの一般的な方法)で呼び出すことができます。ここで、各サービスは単に?callback = cbクエリ文字列へのパラメータ、例:

http://www.servicestack.net/ServiceStack.Hello/servicestack/hello/world?callback=cb

これは、ServiceStackを使用した場合の柔軟性と生産性のメリットのもう1つの例です。Webサービスで 文字通りほとんどすべてを返す に文字通り摩擦のない柔軟性と表現の自由が与えられ、期待どおりにシリアル化されます。

WCF(すぐに使用できる機能が多い)よりも使いやすいだけでなく、 すべてのコンポーネントが最大のパフォーマンスを発揮するように高度に最適化されています の場合もはるかに高速です。

87
mythz

CORSプラグインがどこにあるかを理解するのに苦労したので、参考までに。たぶん私はただ厚いです。

入った ServiceStack.ServiceInterface.Cors

7
Tyson Phalp