Ошибка CORS для запроса PUT к моему проекту C # WebAPI2, но я включил CORS - PullRequest
0 голосов
/ 27 сентября 2019

Я написал .net Web Api 2 с помощью c #.И я хочу использовать свой API от клиента (веб-сайт Umbraco).Я хочу отправить следующий запрос PUT от моего клиента с помощью ajax: (С заголовками я только что попробовал кое-что из других вопросов о переполнении стека)

                $.ajax({
                method: method,
                url: url,
                crossDomain: true,
                data: {
                    Value: value,
                    Keyfigure_id: keyfigure_id,
                    Record_date: record_date
                }

            });

метод и URL - это просто динамические переменные.в этом случае метод "PUT".И URL-адрес http://localhost:PORT/APIROUTE

И вот часть моего APIController, которая должна срабатывать:

    [System.Web.Http.Route("APIROUTE")] //route of the api
    [System.Web.Http.HttpPut]
    [System.Web.Http.HttpOptions]
    public ActionResult UpdateKeyfigureValue(int id, [FromBody] KeyfigureValueDTO keyfigureValueDto)
    {

        string request_type = HttpContext.Current.Request.HttpMethod;

        if(request_type != "PUT")
        {
            return new HttpStatusCodeResult(HttpStatusCode.OK);
        }

        _kfLogic.UpdateKeyfigureValue(id, keyfigureValueDto);
        return new HttpStatusCodeResult(HttpStatusCode.OK);

    }

Здесь я добавил код для запросов OPTIONS, потому что я выяснил, что браузерыотправьте запрос OPTIONS перед запросом PUT, чтобы проверить, доступен ли PUT.

Мое полное сообщение об ошибке, которое я получаю в браузере:

400 Статус из OPTIONS

Доступ к XMLHttpRequest по адресу https://localhost:44389/api/keyfigure/value/41' из источника 'http://localhost:65041' заблокирован политикой CORS: Ответ на предпечатный запрос не проходит проверку контроля доступа: не имеет статуса HTTP ok.

Некоторая дополнительная информация, которую я выяснил во время отладки:

  • Я могу отправить запрос PUT с точно такими же параметрами и т. Д. От Почтальона.
  • Я также могу отправить запрос OPTIONS от почтальона А теперь интересная часть : Когда я отправляю запрос PUT или OPTIONS от Почтальона на тот же URL, и я устанавливаю точку останова в праве Visual Studioдо возврата программа останавливается.Но когда я запускаю его из браузера, он даже не достигает этого кода.

Вот моя конфигурация Cors в Web API: web.config:

    <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/>
    </modules>
    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Headers" value="Content-Type" />
            <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        </customHeaders>
    </httpProtocol>
    <handlers>
        <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
        <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
        <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

WebApiConfig.cs: открытый статический void Register (конфигурация HttpConfiguration) {// Конфигурация и службы Web API

        // Web API routes
        config.EnableCors();
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

В верхней части моего контроллера, прямо над определением класса:

[EnableCors(origins: "http://localhost", headers: "*", methods: "*")]

Если это интересно, я использую IIS Express (из VS2019) для API и клиента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...