OpenSeadragon:使用代理获取XML数据导致tile无法加载

时间:2014-08-14 14:24:13

标签: c# xml proxy seadragon openseadragon

我有一个使用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实际上并未链接到它来自的网页,但我不知道如何处理这个问题。有什么我可以做的来解决它,或者我的代理控制器根本无法工作?如果它不起作用,我还能做些什么来显示这些图像?

编辑:我的另一个想法是,tileources可能没有加载,因为数据是作为字符串而不是作为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>

1 个答案:

答案 0 :(得分:0)

不幸的是,OpenSeadragon还不支持直接传递XML;你必须打破这些信息。请参阅答案:

https://github.com/openseadragon/openseadragon/issues/460