Как я могу изменить код запроса JavaScript HTTP post на C #, используя ‘no-cors’?

#javascript #c# #http #http-headers #cors

#javascript #c# #http #http-заголовки #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 , хотя это возможно, похоже, что мне нужно установить ‘no-cors’ в C # в соответствии с JavaScript, хотя я не уверен, как это сделать. Но с этим могут быть другие проблемы, которых я не вижу.

 {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
}}
  

Комментарии:

1.Просто краткое предупреждение: в настоящее время вы записываете 0 байты в файл (с File.WriteAllBytes помощью), потому что вы инициализировали пустой массив байтов, и поэтому вы также отправляете массив из 0 байт на свой сервер. То, что вы хотите, это использовать var byteArray = File.ReadAllBytes(file)

2. CORS — это функция браузера. HttpClient не использует или не подчиняется CORS.

3. Каково значение backendUrl в вашей версии JavaScript?

4. Зачем вообще записывать файл?

5. использование @MindSwipe var byteArray = File.ReadAllBytes(file); выдает мне точно такую же ошибку. Я не могу использовать это непосредственно в Client.PostAsync , поскольку он жалуется на формат содержимого. @John Ок, спасибо, так что, насколько я понимаю, это не проблема cors.

Ответ №1:

Как Джон изложил в комментариях, no-cors — это не серверная часть, которую вам нужно реплицировать. CORS — это функция браузера, посредством которой, если JavaScript отправляет запрос на загрузку содержимого откуда-то, кроме того, откуда пришел сам файл JavaScript, тогда браузер (из вежливости) проверяет на целевом сервере «ваш URL x, с каких мест может быть загружен JavaScript и разрешен доступ к x?» — это дает серверу возможность ответить «только JavaScript из этих мест a, b, c может запрашивать мой файл x», и затем браузер принимает решение о том, может ли запущенный в данный момент JavaScript получить доступ к x

Вы можете отключить это, если вы можете терпеть ограничения, связанные с этим, и это то, что делает no-cors; это изменяет поведение браузера

Таким образом, вы, надеюсь, видите, что no-cors — это инструкция для браузера, и с вашим c # вы эффективно выводите браузер из уравнения, поэтому маловероятно, что его имитация изменит поведение сервера. Теоретически это возможно; ваш сервер может быть закодирован для отказа в доступе к URL-адресу, для которого он недавно не видел запрос параметров (браузеры в режиме CORS сначала отправляют параметры), но на самом деле более вероятно, что основная причина — что-то более простое, например, вы отправляете сообщение в действие, которое закодированоожидать получения

Комментарии:

1. Ага, так что cors будет играть роль, только если я перетащу файл на фактический сервер. Как я могу добавить дополнительные параметры для запроса, хотя, возможно, это недостающая ссылка? Итак, мне нужно будет запросить заголовок Client.DefaultRequestHeaders. = 'dummy'; следующим образом? только с определенной опцией, о которой я не знаю.

2. Этот ответ помог. Я мог бы получить результаты с помощью запроса PUT.

3. Проблема CORS была бы актуальна только в том случае, если вы делали запрос с помощью JavaScript в браузере. Это своего рода защита от копирования, которую реализуют браузеры, но поскольку вы хотите, чтобы у вас не было браузера (вы фактически пишете свой собственный браузер), CORS не применяется. Похоже, что окончательное предложение, которое, мы надеемся, привело к решению; сервер не принимал ваш POST, но вы решили его с помощью PUT; это согласуется с сервером, который ожидает PUT, но получает POST — ответ в таком случае должен быть «метод не разрешен»