Ну, название здесь действительно плохое, но у меня не было другого способа объяснить, что происходит с моим сервером.
У меня нормальный веб api2, новый. Я установил кросс-домен и только поставил
config.EnableCors()
; на webapiconfig
,
У меня есть MailController, который содержит этот метод:
[HttpPost]//omUrl/{url?}
[Route(@"~/api/Mail/MailOpen")]
public void MailOpen()
{
try
{
File.Create(@"D:\Emails\Alive.html");
}
catch (Exception ex)
{
// ignored
}
}
и запустить в сети с этим хостом: http://localhost:56212/
Итак, я пытаюсь опубликовать некоторые данные, чтобы проверить междоменную политику, и я публикую этот код php:
<?php
$url = 'http://localhost:56212/api/Mail/MailOpen';
$data = array('Smtp' => 'value1', 'Subject' => 'value2');
// use key 'http' even if you send the request to https://...
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data),
),
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
var_dump($result);
?>
Этот код попадает на сервер и создается Alive.html, подождите. Как это может быть, я спросил себя, у меня еще нет кросс-доменной политики на этом контроллере? ..
Поэтому я попытался запустить этот код JavaScript:
<script>
$.get(
"http://localhost:56212/api/Mail/MailOpen",
{ 'G': "aa94a7cf-7794-41ff-b8d0-fcfe34fcb19c" }, // put your parameters here
function (responseText) {
console.log(responseText);
}
);
</script>
Который должен делать то же самое .. но я получаю эту ошибку:
jquery-1.11.2.min.js: 4 GET HTTP: // локальный: 56212 / API / Почта / MailOpen G = aa94a7cf-7794-41ff-b8d0-fcfe34fcb19c m.ajaxTransport.send @ jquery-1.11.2.min.js: 4m.extend.ajax @ jquery-1.11.2.min.js: 4m.each.m. (анонимная функция) @ jquery-1.11.2.min .js: 4m.extend.getJSON @ jquery-1.11.2.min.js: 4 (анонимная функция) @ index.html: 6
index.html: 1 XMLHttpRequest не может загрузить HTTP: // локальный: 56212 / API / Почта / MailOpen G = aa94a7cf-7794-41ff-b8d0-fcfe34fcb19c. В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Происхождение ‘null’, следовательно, не разрешено. Ответ имел HTTP-код состояния 405.
Что нормально, потому что у меня еще нет политики.
Кто-нибудь может сказать мне, почему php работал и jQuery возвращает ошибку?
Ты все.]
Редактировать :
Ну, это еще хуже .. Я только что видел, что я пытаюсь использовать GET
опубликовать
Поэтому я изменил свой запрос на публикацию, и сервер взял его, и он работал, он даже создал файл, но выдает ошибку index.html:1 XMLHttpRequest cannot load http://localhost:56212/api/Mail/MailOpen. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
Как это может дать ошибку и все еще работать?
А еще лучше, как это работает?
CORS — это механизм безопасности, который зависит от браузера. Ваш PHP не является типичным веб-браузером и не требует применения политик CORS.
Из Википедии:
Стандарт CORS описывает новые заголовки HTTP, которые позволяют браузерам и серверам запрашивать удаленные URL-адреса только при наличии разрешения. Хотя некоторая проверка и авторизация может выполняться сервером, браузер, как правило, несет ответственность за поддержку этих заголовков и соблюдение ограничений, которые они налагают.
Для методов запросов AJAX и HTTP, которые могут изменять данные (обычно это методы HTTP, отличные от GET, или для использования POST с определенными типами MIME), спецификация предписывает браузерам «предварительно выполнить» запрос, запрашивая поддерживаемые методы у сервера с запросом HTTP OPTIONS заголовок, а затем, после «одобрения» с сервера, отправляет фактический запрос с фактическим методом HTTP-запроса. Серверы также могут уведомлять клиентов о необходимости отправки «учетных данных» (включая файлы cookie и данные HTTP-аутентификации) с запросами.
Других решений пока нет …