我有一个 Blazor WASM 应用程序和一个 Web Api,可以通过 HttpClient 由 Blzor 调用。这两个程序都运行在同一台机器上(并且也在生产环境中运行,这对于小型企业应用程序来说不应该是陌生的!)。
从 Blazor 客户端调用 Web Api 导致客户端 CORS 异常
从源“https://localhost:5001”获取“http://localhost:4040/”的访问已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明响应满足您的需求,请将请求的模式设置为“no-cors”以在禁用 CORS 的情况下获取资源。
这是这种情况下的预期行为。
在我用 PHP 开发的一个以前的 api 项目中,它具有相同的客户端行为,我可以通过简单地设置响应头来绕过 CORS 异常,例如
$response = new Response;
$response->setState(false, $route->command);
...
header("Access-Control-Allow-Origin: *");
echo $response;
Run Code Online (Sandbox Code Playgroud)
现在我想在我的 .net 5.0 Web Api 中使用它。我在互联网上找到了不同的文档来解决这个问题
https://docs.microsoft.com/de-de/aspnet/core/security/cors?view=aspnetcore-5.0 https://www.c-sharpcorner.com/article/enabling-cors-in-asp-net -core-api-application/ https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.cors.infrastructure.corspolicybuilder.withorigins?view=aspnetcore-5.0
并在我的 api 中实现它
public class Startup {
//---------------------------------------------------------------------
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
//---------------------------------------------------------------------
public IConfiguration Configuration { get; }
//---------------------------------------------------------------------
// This method gets …Run Code Online (Sandbox Code Playgroud) 我遇到的问题是,在我的 Angular 应用程序中, 类型“Navigator”上不存在错误属性“序列”。 得到。
https://stackblitz.com/edit/angular-ivy-kf19n7?file=src/app/app.component.ts
该应用程序在本地模式下运行。要修复此错误,我必须将串行集成到导航器界面中。
https://wicg.github.io/serial/
有人可以帮我怎么做吗?
不幸的是我的尝试显示错误
interface Navigator extends MSFileSaver,..... {
readonly Serial: serial; }
Run Code Online (Sandbox Code Playgroud)
谢谢 :)
编辑:已解决
我编辑了 Stackblitz 文件。
我想问一下WEB Api架构。我的项目由少量 DDD、CQRS(无 ES)微服务组成。每个服务都有域、应用程序、基础设施和 UI 层。对于此示例,我将使用 BikeMicroservice。它在 UI 层中有 BikeController,它向 MediatR 发送命令或查询对象。在应用程序层中,我定义了处理程序(对于每个 C 或 Q),它们使用相同的 BikeService 对象来执行 C/Q。此外,BikeService 具有 BikeRepository,它也使用 EF Core DbContext 对象执行命令和查询。
它是合适的 CQRS 设备吗?
我担心服务和存储库对象是否真的应该执行查询和命令。我在项目中观察到的唯一优点是控制器更薄(仅发送查询或命令)。
如何升级微服务架构?
我应该将 DAL 和服务划分为使用 EF Core 的 BikeCommandRepository 和使用 Dapper 的 BikeQueryRepository 吗?
我正在开发一个公共 API,用户将在参数中发送 byte[]。我已经实现了 API 方法并想要对其进行测试,但是如果我在邮递员中尝试,则无法发送字节[]。出现以下错误
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "|e1896d86-412b7762126469ae.",
"errors": {
"$": [
"The JSON value could not be converted to System.Byte[]. Path: $ | LineNumber: 0 | BytePositionInLine: 1."
]
}
Run Code Online (Sandbox Code Playgroud)
}
API方法参数
public IActionResult Upload(int clientId, string dtName, byte[] dtValues, bool append)
{
}
Run Code Online (Sandbox Code Playgroud)
邮递员电话
现在所有主要浏览器都支持DecompressionStream API,但我不知道如何使用它fetch()在浏览器中解压缩 gzip 文件。
以下代码适用于 base64 字符串:
\nconst decompress = async (url) => {\n const ds = new DecompressionStream(\'gzip\');\n const response = await fetch(url);\n const blob_in = await response.blob();\n const stream_in = blob_in.stream().pipeThrough(ds);\n const blob_out = await new Response(stream_in).blob();\n return await blob_out.text();\n};\n\ndecompress(\n \'data:application/octet-stream;base64,H4sIAAAAAAAAE/NIzcnJVyjPL8pJAQBSntaLCwAAAA==\'\n).then((result) => {\n console.log(result);\n});Run Code Online (Sandbox Code Playgroud)\r\n但是,如果我在 MacOS 上hello.txt.gz使用创建文件(是内容为“hello world”的纯文本文件),则上面的函数会抛出错误。gzip hello.txthello.txt
decompress(\'/hello.txt.gz\').then((result) => {\n console.log(result);\n});\nRun Code Online (Sandbox Code Playgroud)\ndecompress(\'/hello.txt.gz\').then((result) => {\n console.log(result);\n});\nRun Code Online (Sandbox Code Playgroud)\n编辑
\n …[HttpGet]
[HttpPost]
public HttpResponseMessage GetXml(string value)
{
var xml = $"<result><value>{value}</value></result>";
return new HttpResponseMessage
{
Content = new StringContent(xml, Encoding.UTF8, "application/xml")
};
}
Run Code Online (Sandbox Code Playgroud)
我使用 Swagger 调用了该操作并传递了此参数“文本值”
预期结果应该是这样的 XML 文件:文本值
实际结果:没有传递值的奇怪 json 结果!https://www.screencast.com/t/uzcEed7ojLe
我尝试了以下解决方案,但没有奏效:
services.AddMvc().AddXmlDataContractSerializerFormatters();
services.AddMvc().AddXmlSerializerFormatters();
Run Code Online (Sandbox Code Playgroud) 我已设法使默认模板正常工作(我的 blazor 独立 SPA 应该从不同的 ADApp - webAPI 获取多个范围的令牌;即使我定义了 extraScopes 或 defaultaccesstokenscopes,我也设法当时仅获取一个范围的令牌)。
builder.Services.AddMsalAuthentication(options =>
{
var config = options.ProviderOptions;
config.Authentication.Authority = "https://login.microsoftonline.com/tenantID";
config.Authentication.ClientId = "clientID";
options.ProviderOptions.DefaultAccessTokenScopes.Add("offline_access");
options.ProviderOptions.DefaultAccessTokenScopes.Add("https://graph.microsoft.com/user.read");
options.ProviderOptions.DefaultAccessTokenScopes.Add("https://tenant.crm.dynamics.com/user_impersonation");
options.ProviderOptions.DefaultAccessTokenScopes.Add("clientID/scope1");
// tried this too
// config.AdditionalScopesToConsent.Add("https://tenant.crm.dynamics.com/user_impersonation");
});
Run Code Online (Sandbox Code Playgroud)
现在有一个问题是如何获取其他令牌,因为如果提到多个范围,它只会获取“clientID”范围的令牌......?并在 HttpClient 请求中使用 wasm 页面中的那些令牌?
在 Angular 中(使用 MSAL),这一切都是自动完成的,您定义所需的范围,它就会获取所有令牌。然后它拦截所有请求,并按请求的域添加授权标头和相应的令牌。
这里是否有类似的机制,或者应该通过为每个请求添加相应的令牌并将 HttpRequestMessage 与 HttpClient.SendAsync() 一起使用来手动完成?
显然,对于业务应用程序来说,如果不接触某种受保护的 API(通常是同一 AAD 中的应用程序),就没有多大用处。例如,假设它可以是对 Dynamics CRM 的 webapi 的简单查询。
azure-active-directory .net-core webassembly blazor-client-side webapi
我看到这篇文章,我知道它有点旧,但它似乎应该可以工作,但是我正在尝试使用 Chrome 80,我认为对 createScriptProcessor 的支持已经结束,因为我无法让它按原样工作。我没有从输入流中得到任何信息。根据我的阅读,createScriptProcessor 应该替换为 AudioWorklet,但它看起来不像解决方案中的一个下降。我是一名初学者 JS 程序员,想知道是否有人对此进行了更改以使用 AudioWorklet 函数而不是 createScriptProcessor ?谢谢,
考虑以下两段代码。两者都将数据返回到 Web API Get 调用。两者都返回一个项目列表。两者都有效。第一个取自 Visual Studio 入门 Blazor Wasm 应用程序。第二个来自在线教程。tblTitles 是远程数据库中的一个表,通过 _dataContext 访问。
应该使用其中哪一个,为什么?或者也许一个更适合特定情况?
[HttpGet]
//First method:
public IEnumerable<TitlesTable> Get()
{
var titles = _dataContext.tblTitles.ToList();
return titles;
}
//Second method:
public async Task<IActionResult> Get()
{
var titles = await _dataContext.tblTitles.ToListAsync();
return Ok(titles);
}
Run Code Online (Sandbox Code Playgroud) 有什么方法可以在 asp.net core webapi 中支持 oneOf 吗?
我可以在请求正文中支持两种不同的架构吗?
https://swagger.io/docs/specification/data-models/oneof-anyof-allof-not/#oneof
webapi ×10
c# ×4
asp.net-core ×3
.net-core ×2
javascript ×2
.net ×1
angular ×1
asp.net ×1
blazor ×1
cors ×1
interface ×1
navigator ×1
nswag ×1
openapi ×1
postman ×1
serial-port ×1
swagger ×1
typescript ×1
vite ×1
web ×1
webassembly ×1
xml ×1