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

posted @ 2020-03-19 21:53  SimplerJiang  阅读(975)  评论(4编辑  收藏  举报