Я написал .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 и клиента