47

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

私は何日もの間、WCF REST に頭を悩ませてきましたが、まったく役に立ちません。

4

2 に答える 2

87

CorsFeature プラグインの使用

グローバル CORS サポートの有効化

CORS ヘッダーを以下のプラグインにラップするCorsFeatureが追加され、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 (または手動グローバル ヘッダー) が登録されると、PreRequest フィルターを追加してすべての登録済みグローバル ヘッダー (つまり、CorsFeature のヘッダー) を発行し、すべてのOPTIONS要求を次のように短絡することによって、すべてのOPTION要求に対してCORS を有効にすることをオプションで選択できます。

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] 応答フィルター属性を使用して、サービスごとに CORS を有効にすることもできます。たとえば、上記のように GET、POST のみを有効にするには、次のようにします。

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

CORS を手動で有効にする

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

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

これは、AppHost 構成で Cross Origin Sharing をグローバルに有効にする方法です。

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 サービスを例にとります。

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パラメーターを追加するだけで、JSONP 経由で各サービスを呼び出すことができます。 、例:

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

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

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

于 2011-11-21T17:19:06.143 に答える
7

CORS プラグインがどこにあるのかわかりにくかったので、参考までに。多分私は太っているだけです。

ですServiceStack.ServiceInterface.Cors

于 2012-12-12T00:00:30.560 に答える