簡體   English   中英

如何使用“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 下載並被允許訪問 x?” - 這讓服務器有機會響應“只有來自 a,b,c 的 JavaScript 可以請求我的文件 x”,然后瀏覽器判斷當前運行的 JavaScript 是否可以訪問 x

如果您可以容忍這樣做帶來的限制,您可以關閉它,這就是 no-cors 所做的; 它改變了瀏覽器的行為

因此,您希望看到 no-cors 是對瀏覽器的指令,並且使用您的 c#,您可以有效地將瀏覽器排除在外,因此模仿它不太可能改變服務器行為。 理論上是可能的; 您的服務器可能被編碼為拒絕訪問它最近沒有看到 OPTIONS 請求的 url(CORS 模式下的瀏覽器首先發送一個選項),但實際上更可能是根本原因更簡單,例如您正在發布到一個被編碼為期待 Get 的動作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM