我有一个 AspNetCore 后端 api(在 F# 和 Giraffe 中),它使用 AzureAD 身份验证和 Microsoft.AspNetCore.Authentication.AzureAD.UI、有状态会话存储和 https only cookie。
前端是使用 Fable 编译为 js 的 Elmish SPA。
如果我只是在 url 栏中输入后端的受保护端点,一切正常,如果尚未登录,我将重定向到 login.microsoft 端点,使用 clientID 等,成功登录后,原始请求完成,我得到了受保护端点的响应。
但是,如果我尝试从 SPA 代码访问相同的端点,例如:使用 fetch 或使用 Fable.Remoting,如果未登录,后端仍会重定向,但重定向到 login.microsoft 的请求不再有效。使用 Fable.Remoting 有一个 CORS 标头,登录端点拒绝。如果我使用 nocors 发送 fetch,登录端点会收到 200 OK 响应,但没有响应正文(例如,登录页面没有 html 代码),而且似乎什么也没发生。
我只是不知道在 SPA 方面应该如何处理,并且无法真正找到任何相关信息。如果从 Fable.Remoting 启动与从浏览器 URL 栏启动,为什么后端会在重定向中包含 CORS 标头?没有响应正文的 fetch-ed 响应有什么问题?我可以只将 js 代码写入我的客户端,但甚至无法弄清楚在纯 js SPA 中如何处理。
还在生产中尝试了整个事情,从等式中删除 webpack devServer 代理,但一切都保持不变。
我不明白以下内容:在下面的代码中,Visual Studio告诉我,我可以通过删除this构造函数中的第二个关键字来简化我的代码.
但为什么我不能放弃第一个this关键字呢?这两个变量都是在构造函数之外的类中声明的,因此对于实例,两者都将被"覆盖"*.
如果我删除这两个this关键字,那么VS会抱怨第一个赋值是针对同一个变量,而不是针对第二个赋值.对我来说唯一明显的区别是第二个变量是一个数组,但我不明白它会如何使它有所不同?
*我怀疑覆盖不是这里正确的术语.
public class CelestialObject {
CelestialBody[] celestialBodies;
int celestialBodyCount;
public CelestialObject(int celestialBodyCount = 2) {
this.celestialBodyCount = celestialBodyCount;
this.celestialBodies = new CelestialBody[celestialBodyCount];
}
}
Run Code Online (Sandbox Code Playgroud) 我尝试解析类似 xml 的标签(但不是正确的 xml 文档..):目标是返回没有开头或结尾空格的“法兰宽度”,但带有内部空格。
open FParsec
let testParser =
pstring "<desc>" .>>. spaces
>>. manyCharsTill anyChar (spaces .>>. pstring "</desc>")
run testParser "<desc> Flange width </desc>"
Run Code Online (Sandbox Code Playgroud)
如果我理解解析器组合器的预期结果:
保持吞咽字符的 anyChar 解析器单元“直到”解析器,它寻找空格,然后是结束标记成功。
实际发生的情况是,“直到”解析器在“宽度”之前的空间上失败(应该如此),但会使 manyTill 解析器短路,而不是让 anyChar 吞下该空间并继续前进。
输出:
val it : ParserResult<string,unit> =
Failure:
Error in Ln: 1 Col: 15
<desc> Flange width </desc>
^
Expecting: '</desc>'
Run Code Online (Sandbox Code Playgroud)
我没有得到什么?或者这里的惯用解决方案是什么?
问题不在于如何让它发挥作用,它是有效的。我只是感兴趣,但无法找出背景中发生的事情以使其工作。
主要示例是标准 Blazor 服务器 webapp 模板,它具有“计数器”和“fetchdata”组件。在 fetchdata 组件中,有protected override async Task OnInitializedAsync()一个被调用,组件呈现自身。如果 OnInitializedAsync() 没有及时返回,渲染仍然发生,在示例中只是写出加载......然后当 OnInitializedAsync() 真正完成时,组件被神奇地重新渲染,但是是什么导致了重新渲染? 它是如何连接在一起的?
框架是否经常查看类的内存以确定是否需要重新渲染?是否只是在 OnInitializedAsync() 调用之前和等待之后调用了页面渲染?
f# ×2
asp.net ×1
asp.net-core ×1
blazor ×1
c# ×1
constructor ×1
elmish ×1
fable-f# ×1
fparsec ×1
safe-stack ×1
this ×1