У меня была та же проблема, и мне удалось ее решить.
Вы правильно сказали Cloudfront разрешить эти заголовки, но вы не добавили эти заголовки туда, где Cloudfront получает шрифт. Да, ваши исходные заголовки разрешены, но Heroku все равно не отправляет эти заголовки со шрифтом.
Чтобы это исправить, вам нужно добавить правильные заголовки CORS к шрифту на Heroku. К счастью, это довольно легко.
Сначала добавьте камень rack/cors
в ваш проект. https://github.com/cyu/rack-cors
Затем настройте сервер Rack для загрузки и настройки CORS для любых ресурсов, которые он обслуживает. Добавьте следующее после предварительной загрузки приложения в config.ru
require 'rack/cors'
use Rack::Cors do
allow do
origins '*'
resource '/cors',
:headers => :any,
:methods => [:post],
:credentials => true,
:max_age => 0
resource '*',
:headers => :any,
:methods => [:get, :post, :delete, :put, :patch, :options, :head],
:max_age => 0
end
end
. Это устанавливает любые ресурсы, возвращаемые из Heroku, для применения соответствующих заголовков CORS. Вы можете ограничить применение заголовков в зависимости от вашего файла и требований безопасности.
После развертывания перейдите в Cloudfront и начните аннулирование всего, что ранее давало вам ошибку разрешения CORS. Теперь, когда Cloudfront загружает свежую копию из Heroku, у него будут правильные заголовки, и Cloudfront передаст эти заголовки клиенту, как ранее было настроено с вашими Origin
разрешениями.
Чтобы убедиться, что вы обслуживаете правильные заголовки со своего сервера, вы можете использовать следующую команду curl для проверки ваших заголовков: curl -I -s -X GET -H "Origin: www.yoursite.com" http://www.yoursite.dev:5000/assets/fonts/myfont.svg
Вы должны увидеть возвращенные следующие заголовки:
Access-Control-Allow-Origin: www.yoursite.com
Access-Control-Allow-Methods: GET, POST, DELETE, PUT, PATCH, OPTIONS, HEAD
Access-Control-Max-Age: 0
Access-Control-Allow-Credentials: true
SelectableList<int> intList = new SelectableList<int>();
((INotifyPropertyChanged)intList).PropertyChanged +=
new PropertyChangedEventHandler(intList_Changed);
ObservableCollection явно реализует INotifyPropertyChanged , что означает, что вы должны привести экземпляр к интерфейсу, прежде чем вы сможете получить доступ к его методам, свойствам и событиям. Почему это делается, я не знаю. Расширение разметки привязки n не «знает» ObservableCollections или какой-либо другой тип. Он проверяет типы, чтобы увидеть, реализуют ли они или расширяют определенные интерфейсы / базовые классы (INPC, INCC, DependencyObject и т. Д.), И поэтому не заботится о том, реализован ли интерфейс явно.
Пользовательский интерфейс может получать и получает уведомление. Это ограничение ПРОСТО с ObservableCollection, которое определяет событие PropertyChanged как защищенное.
FWIW, я думаю, вам лучше оставить ObservableCollection в покое и просто добавить еще одно свойство к вашей виртуальной машине.