Реализация CORS, показывающая, что метод не разрешен для запроса POST - PullRequest
1 голос
/ 27 мая 2019

Я пытаюсь вызвать метод службы WCF, используя запрос POST Http из другого проекта, он разрешает запрос GET, но когда я пытаюсь выполнить запрос POST, он показывает «Метод не разрешен» .

Когда я пытался это показать, эта ошибка в моей консоли:

Доступ к XMLHttpRequest по адресу http://localhost:7280/api/values/24' от источника 'http://localhost:6538' заблокирован политикой CORS: Ответ на предпечатный запрос не проходит проверку контроля доступа: не имеет статуса HTTP ok.

Веб-API: Метод:

[WebInvoke(UriTemplate = "/values", Method = "POST", ResponseFormat = WebMessageFormat.Json), CorsEnabled]
        void AddValue(string value);

Реализация метода

public void AddValue(string value)
        {
            string id = nextId.ToString();
            nextId++;
            allValues.Add(id, value);
            string location = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.ToString() + "/" + id;
            WebOperationContext.Current.OutgoingResponse.SetStatusAsCreated(new Uri(location));
        }

Клиентское приложение:

$("#post").click(function () {
            var data = "\"" + $("#value").val() + "\"";
            $.ajax({
                url: valuesAddress,
                type: "POST",
                contentType: "application/json",
                data: data,
                success: function (result) {
                    $("#result").text(result);
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    $("#result").text(textStatus);
                }
            });
        });

Я последовал https://code.msdn.microsoft.com/Implementing-CORS-support-c1f9cd4b/view/SourceCode#content Я создал веб-API и клиентское приложение как разные проекты. Пожалуйста, помогите решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

У меня была проблема с CORS, вот как я это сделал в asp.net (то же самое, судя по вашим тегам):

  • Я установил следующий пакет NuGet:

    Установочный пакет Microsoft.AspNet.WebApi.Cors

  • Затем в вашем файле WebApiConfig:
        public static void Register(HttpConfiguration config)
        {
            EnableCorsAttribute cors = new 
                 EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);

            AddRoutes(config);
        }

Вы уже сделали этот шаг, просто переместите метод EnableCors(cors) над AddRoutes(config);

  • Наконец, вы помещаете следующий атрибут выше SaveWithPost:
[EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]

Примечание: если вы продолжаете получать эту ошибку:

ОПЦИИ http://localhost/Service1.svc/saveWithPost/WithParameter 405 (метод не разрешен) Доступ к XMLHttpRequest в «http://localhost/Service1.svc/saveWithPost/WithParameter' из источника» http://localhost' был заблокирован политикой CORS: Ответ на предпечатный запрос не проходит проверку контроля доступа: не имеет статуса HTTP ok.

Читайте здесь Официальная документация Microsoft . Ссылка открывает раздел «Как работает Cors», где вы можете прочитать больше о предварительных запросах. Вскоре браузер отправляет дополнительный запрос до фактического запроса. Подробнее здесь .

Примечание: проверьте, не блокируете ли вы запрос OPTIONS. Например, некоторые компании используют программное обеспечение для продуктов безопасности, сетей и хранилищ на основе сетевых устройств и облачных сервисов, которые фильтруют все поступающие запросы на свой собственный сервер, что может когда-нибудь привести к этому. (маловероятно)

Надеюсь, это поможет,

Приветствия

0 голосов
/ 27 мая 2019

Вы включили атрибут Cors, когда вы посмотрите документацию , в MSDN вы увидите, что вам нужно предоставить атрибут выше класса или метода. Код ниже позволяет всем методам в классе называться кросс-домен.

[EnableCors(origins: "*", headers: "*", methods: "*")]
public class Service1 : IService1
{
  // Details omitted
}

Приведенный ниже код включает значения cors для метода GetAllStudents.

public class Service1 : IService1
{
  [EnableCors(origins: "*", headers: "*", methods: "*")]
  List<string> GetAllStudents()
  {
    // Details omitted
  }
}
...