OpenSeadragon: использование прокси для получения данных XML приводит к тому, что плитки не загружаются
У меня есть сайт, который использует OpenSeadragon для отображения изображений с глубоким увеличением. Он работает с некоторыми тестовыми изображениями, но нужные мне изображения находятся в домене, к которому я не могу получить доступ с моей веб-страницы из-за проблемы безопасности (без заголовка "Access-Control-Allow-Origin"). Напомним, что страница, на которой размещены изображения DZI, принадлежит моей компании, но, поскольку это сайт Amazon S3, я не могу добавить заголовок на сайт, поскольку Amazon не предоставляет такую возможность.
Я создал прокси-контроллер, и контроллер успешно получает необходимые ему XML-данные. Вот мой код контроллера:
public HttpResponseMessage Get(string bucket, string guid)
{
guid = guid.ToLower(); // in case guid is passed as uppercase
string url = "http://" + bucket + ".img.mywebsite.org/" + guid + ".xml";
WebRequest request = WebRequest.Create(url);
request.Credentials = CredentialCache.DefaultCredentials;
WebResponse response = request.GetResponse();
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string serverData = reader.ReadToEnd();
Console.WriteLine(serverData);
reader.Close();
response.Close();
// create new XML doc
// load serverData into XML doc
// return XMLdoc
return new HttpResponseMessage()
{
Content = new StringContent(serverData)
};
}
Контроллер возвращает данные XML правильно. Например, когда я захожу на http://mysite.mvc/api/test?bucket=66&guid=e41de95d-6235-4581-b823-4887b50eb8ad, я получаю страницу с правильно выглядящими данными XML. Я также проверил это на расширении хрома DHC.
На своей веб-странице я выполняю Ajax-вызов прокси-контроллера и использую возвращенный XML, чтобы открыть Seadragon:
var imgdata = {
bucket: "66",
guid: "e41de95d-6235-4581-b823-4887b50eb8ad",
};
var ajaxresult = $.ajax({
url: "/api/test",
type: 'get',
success: function(data) {
//alert("Success");
alert(data);
var viewer = OpenSeadragon({
id: "viewerdiv",
prefixUrl: "../../Scripts/openseadragon/images/",
tileSources: data
});
},
error: function(jqXHR, textStatus, errorThrown) {
alert(jqXHR.responseText || textStatus);
},
data: imgdata
});
console.log(ajaxresult);
Предупреждение в моей функции успеха Ajax отображает ожидаемый XML. Однако в моём средстве просмотра Seadragon плитки не отображаются (но средство просмотра открыто, и там есть кнопки навигации). В моей консоли у меня есть этот ответ:
Tile a.Tile failed to load: 10/01.jpg
за каждую плитку на изображении. Я подозреваю, что это потому, что мой Seadragon Viewer открывается со статическим XML, который на самом деле не связан с веб-страницей, откуда он, но я понятия не имею, что с этим делать. Могу ли я что-то сделать, чтобы это исправить, или мой прокси-контроллер просто не работает? И если это не работает, что еще я могу сделать, чтобы отобразить эти изображения?
редактировать: еще одна мысль у меня заключается в том, что, возможно, источники листов не загружаются, потому что данные передаются в виде строки, а не в виде XML-документа?
Я также попробовал это вместо OpenSeadragon()
var viewer = new Seadragon.Viewer("familysearch");
viewer.openDzi(data);
но я получил ошибку 400 неверный запрос в моей программе просмотра Seadragon.
Я также попытался отрезать заголовок XML с помощью data.substring(38), но та же ошибка. Мой XML выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<Image TileSize="256" Overlap="1" Format="jpg" ServerFormat="Default" xmlns="http://schemas.microsoft.com/deepzoom/2009">
<Size Width="550" Height="1765" />
</Image>
1 ответ
К сожалению, OpenSeadragon пока не поддерживает передачу XML напрямую; вам придется разбить информацию на части. Смотрите ответ здесь: