我有一个使用 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 chrome 扩展上对此进行了测试。
在我的网页上,我对代理控制器进行 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 查看器是用静态 XML 打开的,而该静态 XML 实际上并没有链接到它来自的网页,但我不知道该怎么做。我可以做些什么来修复它,还是我的代理控制器根本无法工作?如果它不起作用,我还能做些什么来显示这些图像?
编辑:我的另一个想法是,也许 tilesources 没有加载,因为数据是作为字符串而不是作为 XML 文档传入的?
我也试过这个而不是 OpenSeadragon()
var viewer = new Seadragon.Viewer("familysearch");
viewer.openDzi(data);
但在我的 Seadragon 查看器中出现 400 错误请求错误。
我还尝试使用 data.substring(38) 切掉 XML 的标题,但同样的错误。我的 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>