asp.net core 系列之容許跨域訪問2之測試跨域(Enable Cross-Origin Requests:CORS)

 

這一節主要講如何測試跨域問題html

 

你能夠直接在官網下載示例代碼,也能夠本身寫,我這裏直接使用官網樣例進行演示git

樣例代碼下載:github

Corsweb

 

一.提供服務方,這裏使用的是API

1.建立一個API項目。或者直接下載樣例代碼json

2.像以前講的那樣設置容許CORS,例如:api

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    // Shows UseCors with CorsPolicyBuilder.
    app.UseCors(builder => { builder.WithOrigins("http://example.com", "http://www.contoso.com", "https://localhost:44375", "https://localhost:5001"); });

    app.UseHttpsRedirection();
    app.UseMvc();
}

 

使用的時候,注意 WithOrigins("https://localhost:<port>"); 這個地址替換爲客戶端地址(即調用方:這裏指部分Razor代碼)跨域

 

二.客戶端,這裏指調用方(頁面中js調用),這裏指Razor部分的代碼

1.建立一個web 應用(Razor pages 或者 mvc )。樣例用的Razor Pages 。mvc

2.在index.cshtml中增長以下代碼app

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">CORS Test</h1>
</div>

<div>
    <input type="button" value="Test" onclick="requestVal('https://<web app>.azurewebsites.net/api/values')" />
    <span id='result'></span>
</div>

<script> function requestVal(uri) { const resultSpan = document.getElementById('result'); fetch(uri) .then(response => response.json()) .then(data => resultSpan.innerText = data) .catch(error => resultSpan.innerText = 'See F12 Console for error'); } </script>

 


 

這裏再多說一下,個人操做流程cors

首先,下載樣例代碼;

而後,在同一個解決方案中,導入Cors樣例代碼,如圖

而後,能夠先把解決方案設置爲多個啓動項目,啓動,看下ClientApp的URL和WebAPI的URL

 

 

 

獲得,個人url 分別以下:

ClientApp
http://localhost:65317/

WebApi
http://localhost:65328/

 

 先中止運行,分別設置api的withOrigin和client頁面中的地址,代碼以下:

WebAPI中的 StartupTest (這個跟Program使用的StartUp文件有關,樣例代碼中使用的StartUpTest)

// Shows UseCors with CorsPolicyBuilder.
            app.UseCors(builder =>
            {
                builder.WithOrigins("http://example.com",
                                    "http://www.contoso.com",
                                    "https://localhost:44375",
                                    "http://localhost:65317");
            });

ClientApp中的Index.cshtml文件代碼以下:

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">CORS Test</h1>
</div>

<div>
    <h3>Test results:</h3>
    <span id='result'></span>
</div>

<div>
    <input type="button" value="Test Widget 1"
           onclick="requestVal('https://webapi123.azurewebsites.net/api/widget/1')" />
    <input type="button" value="Test All Widgets"
           onclick="requestJson('https://webapi123.azurewebsites.net/api/widget')" />
    <input type="button" value="Test All Val"
           onclick="requestJson('https://webapi123.azurewebsites.net/api/values')" />
    <input type="button" value="Test Val 1"
           onclick="requestVal2('https://webapi123.azurewebsites.net/api/values/1')" />
    <input type="button" value="Test Val 2" onclick="requestVal2('http://localhost:65328/api/values')" />
    <input type="button" value="Test Val 3" onclick="requestJson('http://localhost:65328/api/values')" />
</div>

<script>
    function requestJson(uri) {
        const resultSpan = document.getElementById('result');

        fetch(uri)
            .then(response => response.json())
            .then(data => resultSpan.innerText = data)
            .catch(error => resultSpan.innerText = 'See F12 Console for error');
    }
</script>

<script>
    function requestVal2(uri) {
        const resultSpan = document.getElementById('result');

        fetch(uri)
            .then(response => response.text())
            .then(data => resultSpan.innerText = data)
            .catch(error => resultSpan.innerText = 'See F12 Console for error');
    }
</script>

 

再運行,測試

發現當WebApi中的 WithOrigins 設置正確時,不會報跨域問題,

不然,報跨域問題。

跨域錯誤截圖

 

 

 若有疑問,能夠參考網址:

https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2#cors-policy-options

相關文章
相關標籤/搜索