Blazor client-side 帶Cookie請求(解決無法帶Cookie請求問題)跨域請求


先說說環境,這邊直接采用的是.net core 3.2 preview 1.0的blazor,頭鐵直接上生產項目,就遇到一個麻煩的地方了。

后端采用的是php + Cookie驗證(等於沒驗證),本身后端是供App的后端,老板節約成本,讓我直接上前端。

后來我發現,Blazor不能使用WebHttpRequest,只能使用服務注入的HttpClient。因為HttpClient的特性就是無法每次請求時都放入不同的cookie。並且由於是框架幫我們注入的

也沒辦法設置cookie,按道理來說,Cookie攜帶應該由框架處理。

但是奇特的一點就來了,微軟它就沒想到會有人用Cookie來做前后端分離,在我查詢好幾天后發現,fetch默認是不帶Cookie請求的!需要自己設置

而在3.2 preview中他的設置方法是:

 

----- 2020-6-10 更新 -------

時間真快,上次寫了一半就去忙別的了,現在微軟都發dotnet 3.2 Blazor wasm Release版本了,下面是Release版本的方法。

 

                requestMessage.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);

  完整請求過程(這里我沒做處理,所以請不要直接照抄,否則你可能用不了)

 

                var requestMessage = new HttpRequestMessage()
                {
                    Method = new HttpMethod("POST"), 
                    RequestUri = uri,
                };
                requestMessage.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);
                requestMessage.Headers.Add("Accept", "application/json");
                requestMessage.Headers.Add("Requests-By-Https", "yes");
                if (formDatas.Count == 0)
                {
                    result = await _http.SendAsync(requestMessage);
                }
                else
                {
                    List<KeyValuePair<string, string>> keyValuePairs = new List<KeyValuePair<string, string>>();
                    
                    foreach (string formdataKey in formDatas.Keys)
                    {
                        keyValuePairs.Add(new KeyValuePair<string, string>(formdataKey, formDatas[formdataKey]));
                    }

                    FormUrlEncodedContent urlEncodedContent = new FormUrlEncodedContent(keyValuePairs);

                    requestMessage.Content = urlEncodedContent;
                    result = await _http.SendAsync(requestMessage);


                }

                if (result.IsSuccessStatusCode)
                {
                    var resultStr = await result.Content.ReadAsStringAsync();

                    ResultModel resultmodel = JsonConvert.DeserializeObject<ResultModel>(resultStr);

                    if (resultmodel.code == 1)
                    {
                        var settings = new JsonSerializerSettings { Error = (se, ev) => { ev.ErrorContext.Handled = true; } };
                        var TResult = JsonConvert.DeserializeObject<T>(resultStr, settings);
                        TResult.Body = resultStr;
                        return TResult;
                    }
                    else
                    {
                        var ERRORResult = ResultModel.Convert<T>(resultmodel);
                        ERRORResult.Body = resultStr;
                        return ERRORResult;
                    }
                    
                }
                else
                {
                    throw new HttpRequestException("Post請求失敗,返回碼:" + result.StatusCode.ToString());
                }

其中:ResultModel 是我自己寫的我的返回類的基類!這里的代碼沒做處理!所以不要照抄。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM