先說說環境,這邊直接采用的是.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 是我自己寫的我的返回類的基類!這里的代碼沒做處理!所以不要照抄。
