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

  • 相关阅读:
    phalcon——HTTP 请求
    phalcon——闪存消息
    phalcon——验证
    Java 字符串分隔 split
    Eclipse "R cannot be resolved"问题
    Android CountDownTimer 类实现倒计时
    Eclipse 打开时“发现了以元素'd:skin'”开头的无效内容。此处不应含有子元素
    Android Studio 设置/更改 SDK 路径
    Android 开发使用自定义字体
    Android Studio "ADB not responding"
  • 原文地址:https://www.cnblogs.com/Simplerjiang/p/12527498.html
Copyright © 2011-2022 走看看