Я пытаюсь выполнить кросс-доменный запрос POST для действия контроллера ASP.NET MVC. Это действие контроллера принимает и использует различные параметры. Проблема заключается в том, что при выполнении запроса предварительной проверки действие контроллера фактически пытается выполнить, и поскольку запрос OPTIONS не передает никаких данных, действие контроллера выдает 500 HTTP-ошибок. Если я удалю код, который использует этот параметр, или сам параметр, вся цепочка запросов будет успешно завершена.
Пример того, как это реализовано:
Действие контроллера
public ActionResult GetData(string data)
{
return new JsonResult
{
Data = data.ToUpper(),
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
Клиентский код
<script type="text/javascript">
$(function () {
$("#button-request").click(function () {
var ajaxConfig = {
dataType: "json",
url: "http://localhost:8100/host/getdata",
contentType: 'application/json',
data: JSON.stringify({ data: "A string of data" }),
type: "POST",
success: function (result) {
alert(result);
},
error: function (jqXHR, textStatus, errorThrown) {
alert('Error: Status: ' + textStatus + ', Message: ' + errorThrown);
}
};
$.ajax(ajaxConfig);
});
});
</script>
Теперь, всякий раз, когда выполняется запрос предварительной проверки, он возвращает 500 HTTP-код, потому что параметр "data" равен NULL, поскольку запрос OPTIONS не передает никаких значений.
Серверное приложение было настроено в моем локальном IIS на порту 8100, а страница, на которой выполняется клиентский код, настроена на порт 8200, чтобы имитировать междоменные вызовы.
Я также настроил хост (на 8100) со следующими заголовками:
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST, GET
Access-Control-Allow-Origin: http://localhost:8200
Обходной путь, который я нашел, состоял в том, чтобы проверить HTTP-метод, который выполняет действие, и если это запрос OPTIONS, чтобы просто вернуть пустой контент, в противном случае выполните код действия. Например:
public ActionResult GetData(string data)
{
if (Request.HttpMethod == "OPTIONS") {
return new ContentResult();
} else {
return new JsonResult
{
Data = data.ToUpper(),
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
}
Но этот подход кажется мне очень неуклюжим. Я подумал о добавлении этой логики к Attribute
, но даже это означало бы украшение каждого действия, которое будет вызвано с помощью CORS с ним.
Есть ли более элегантное решение для работы этой функции?