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 是我自己写的我的返回类的基类!这里的代码没做处理!所以不要照抄。