c# - net - servicestack REST API和CORS




web api cors.net core (2)

使用CorsFeature插件

啟用全局CORS支持

我們現在有一個CorsFeature ,它將CORS頭文件包裝到下面的Plugin中,以便更容易為您的ServiceStack服務添加CORS支持。

通常這就是現在所需要的:

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(或手動全局標頭)後,您可以選擇為所有OPTION請求啟用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] 響應過濾器屬性在每個服務的基礎上啟用CORS,該屬性具有與上面相同的默認值。 例如,您可以按上述方式啟用GET,POST:

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

手動啟用CORS

ServiceStack的優點在於它基於高度靈活和簡單的核心。 我們不會嘗試在所有內容上構建強類型API,因為無法預測將來會出現什麼新的HTTP標頭/ StatusCodes。 因此,雖然我們提供了方便的行為來完成常見任務,但我們還提供了一個靈活的API,允許您配置任何所需的HTTP輸出。

設置全局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" }, }
        };
    }
}

以上是開發Web服務所需的所有C#代碼,然後在所有HTTP動詞(GET,POST等)和內置端點(即JSON,XML,JSV,HTML,CSV, SOAP 1.1 / 1.2 - 免費,無需任何配置或摩擦。 查看上述Web服務的實例

除了上述端點之外,每個服務都可以由JSONP(另一種在Ajax應用程序中啟用跨域服務調用的流行方式)調用,其中每個服務都可以通過JSONP調用,只需將?callback = cb參數添加到查詢字符串即可,例如:

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

這是使用ServiceStack獲得靈活性和生產力的另一個例子,您可以在Web服務中實現無摩擦的靈活性和表達自由, 幾乎可以返回任何內容 ,並按預期進行序列化。

它不僅比WCF更容易使用(具有開箱即用的更多功能),而且在所有組件都經過高度優化以獲得最佳性能的同時,它也更快。

任何人都知道servicestack框架是否可用於創建CORS REST服務?

我幾天來一直在抨擊WCF REST的東西 - 完全沒用。

謝謝


僅供參考,因為我很難弄清楚CORS插件的位置。 也許我只是厚厚的。

它位於ServiceStack.ServiceInterface.Cors





cors