如何使用 'no-cors' 将 JavaScript HTTP post 请求代码更改为 C#?
How can I change JavaScript HTTP post request code to C#, using 'no-cors'?
我正在尝试做与 JavaScript 代码相同的事情,但在 C# 中。最终结果是我想从 C# 代码自动执行此任务,我将在其中手动创建这些文件。此代码用于网页以实现其目标:
第一个功能是将文件放在缓冲区的一个地方。
function FileIOU(file: File, backendUrl: string, dispatch: any) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onerror = reject;
reader.onload = async () => {
await fetch(`${ backendUrl}/ www.FileIOU?filename =${file.name}`, {
method: 'POST',
body: reader.result,
mode: 'no-cors',
}).then(resolve).catch (err => {
console.log('FileIOU', err);
dispatch(consoleOutputAction('Failed to send file: ' + file.name, 'error'));
reject();
});
};
reader.readAsArrayBuffer(file);
第二个功能是将此文件调用为站点上的 运行。
fetch(`${props.configuration.backendUrl}/www.RunFile?name=${e.currentTarget.id}`);
我模仿这个的方式是:
public async static Task PostFile(string file)
{
byte[] byteArray = new byte[] { };
File.WriteAllBytes(file, byteArray);
var fileName = Path.GetFileName(file);
var byteContent = new ByteArrayContent(byteArray);
var response = await Client.PostAsync(
"https://localhost/simulatorweb/www.FileIOU?filename="+$"{fileName}"
, byteContent);
}
第二部分是:
public async static Task RunFile(string fileName)
{
var response = await Client.PostAsync(
$"https://localhost/www.RunFile?name="+$"{fileName}", null);
}
调用此函数后,我得到响应 405
,尽管这看起来可能需要根据 JavaScript 在 C# 中设置 'no-cors',但我不是确定如何执行此操作。但是这可能还有其他问题,我没有看到。
{StatusCode: 405, ReasonPhrase: 'Method Not Allowed', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
{
Date: Fri, 30 Oct 2020 06:15:42 GMT
Connection: keep-alive
Vary: Origin
Accept-Ranges: bytes
Content-Length: 0
Allow: GET
Allow: HEAD
Allow: OPTIONS
}}
正如约翰在评论中概述的那样,no-cors 不是您需要复制的服务器端内容。 CORS 是一种浏览器功能,如果 JavaScript 请求从 JavaScript 文件本身所在的地方以外的地方下载内容,那么浏览器(出于礼貌)会检查目标服务器“为您的url x,JavaScript 可以从哪些地方下载并被允许访问 x?” - 这让服务器有机会响应“只有 JavaScript 来自这些地方 a,b,c 可以请求我的文件 x”,然后浏览器判断 JavaScript 当前是否 运行, 可以访问 x
如果你能忍受这样做带来的限制,你可以关闭它,这就是 no-cors 所做的;它改变了浏览器行为
因此,您有望看到 no-cors 是对浏览器的指令,使用您的 c# 可以有效地将浏览器排除在等式之外,因此模仿它不太可能改变服务器行为.理论上是可能的;您的服务器可能被编码为拒绝访问最近没有看到 OPTIONS 请求的 url(CORS 模式下的浏览器首先发送一个选项),但实际上更可能的根本原因是更简单的事情,例如您正在发布一个被编码为期望 Get
的操作
我正在尝试做与 JavaScript 代码相同的事情,但在 C# 中。最终结果是我想从 C# 代码自动执行此任务,我将在其中手动创建这些文件。此代码用于网页以实现其目标:
第一个功能是将文件放在缓冲区的一个地方。
function FileIOU(file: File, backendUrl: string, dispatch: any) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onerror = reject;
reader.onload = async () => {
await fetch(`${ backendUrl}/ www.FileIOU?filename =${file.name}`, {
method: 'POST',
body: reader.result,
mode: 'no-cors',
}).then(resolve).catch (err => {
console.log('FileIOU', err);
dispatch(consoleOutputAction('Failed to send file: ' + file.name, 'error'));
reject();
});
};
reader.readAsArrayBuffer(file);
第二个功能是将此文件调用为站点上的 运行。
fetch(`${props.configuration.backendUrl}/www.RunFile?name=${e.currentTarget.id}`);
我模仿这个的方式是:
public async static Task PostFile(string file)
{
byte[] byteArray = new byte[] { };
File.WriteAllBytes(file, byteArray);
var fileName = Path.GetFileName(file);
var byteContent = new ByteArrayContent(byteArray);
var response = await Client.PostAsync(
"https://localhost/simulatorweb/www.FileIOU?filename="+$"{fileName}"
, byteContent);
}
第二部分是:
public async static Task RunFile(string fileName)
{
var response = await Client.PostAsync(
$"https://localhost/www.RunFile?name="+$"{fileName}", null);
}
调用此函数后,我得到响应 405
,尽管这看起来可能需要根据 JavaScript 在 C# 中设置 'no-cors',但我不是确定如何执行此操作。但是这可能还有其他问题,我没有看到。
{StatusCode: 405, ReasonPhrase: 'Method Not Allowed', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
{
Date: Fri, 30 Oct 2020 06:15:42 GMT
Connection: keep-alive
Vary: Origin
Accept-Ranges: bytes
Content-Length: 0
Allow: GET
Allow: HEAD
Allow: OPTIONS
}}
正如约翰在评论中概述的那样,no-cors 不是您需要复制的服务器端内容。 CORS 是一种浏览器功能,如果 JavaScript 请求从 JavaScript 文件本身所在的地方以外的地方下载内容,那么浏览器(出于礼貌)会检查目标服务器“为您的url x,JavaScript 可以从哪些地方下载并被允许访问 x?” - 这让服务器有机会响应“只有 JavaScript 来自这些地方 a,b,c 可以请求我的文件 x”,然后浏览器判断 JavaScript 当前是否 运行, 可以访问 x
如果你能忍受这样做带来的限制,你可以关闭它,这就是 no-cors 所做的;它改变了浏览器行为
因此,您有望看到 no-cors 是对浏览器的指令,使用您的 c# 可以有效地将浏览器排除在等式之外,因此模仿它不太可能改变服务器行为.理论上是可能的;您的服务器可能被编码为拒绝访问最近没有看到 OPTIONS 请求的 url(CORS 模式下的浏览器首先发送一个选项),但实际上更可能的根本原因是更简单的事情,例如您正在发布一个被编码为期望 Get
的操作