如何从数据“ URI”“下载”?

svi*_*ick 2 .net c# data-uri

我有一个数据:需要使用正常的.Net WebClient/ “下载”(读取:作为流或字节数组加载)的URI WebRequest。我怎样才能做到这一点?

我需要这样做是因为我想显示从SVG生成的XAML文件,其中包括一些使用数据的图像:URI。我不想总是解析XAML,将图像保存到磁盘,然后将XAML更改为指向文件。我相信WPF在WebRequest内部使用这些图像。

svi*_*ick 5

您可以WebRequest.RegisterPrefix()用来做到这一点。您将需要实现IWebRequestCreate返回一个自定义的WebRequest返回一个自定义的返回,该自定义WebResponse最终可以用来从URI中获取数据。它可能看起来像这样:

public class DataWebRequestFactory : IWebRequestCreate
{
    class DataWebRequest : WebRequest
    {
        private readonly Uri m_uri;

        public DataWebRequest(Uri uri)
        {
            m_uri = uri;
        }

        public override WebResponse GetResponse()
        {
            return new DataWebResponse(m_uri);
        }
    }

    class DataWebResponse : WebResponse
    {
        private readonly string m_contentType;
        private readonly byte[] m_data;

        public DataWebResponse(Uri uri)
        {
            string uriString = uri.AbsoluteUri;

            int commaIndex = uriString.IndexOf(',');
            var headers = uriString.Substring(0, commaIndex).Split(';');
            m_contentType = headers[0];
            string dataString = uriString.Substring(commaIndex + 1);
            m_data = Convert.FromBase64String(dataString);
        }

        public override string ContentType
        {
            get { return m_contentType; }
            set
            {
                throw new NotSupportedException();
            }
        }

        public override long ContentLength
        {
            get { return m_data.Length; }
            set
            {
                throw new NotSupportedException();
            }
        }

        public override Stream GetResponseStream()
        {
            return new MemoryStream(m_data);
        }
    }

    public WebRequest Create(Uri uri)
    {
        return new DataWebRequest(uri);
    }
}
Run Code Online (Sandbox Code Playgroud)

这仅支持base64编码,但可以轻松添加对URI编码的支持。

然后,您可以像这样注册它:

WebRequest.RegisterPrefix("data", new DataWebRequestFactory());
Run Code Online (Sandbox Code Playgroud)

是的,这确实适用于检索数据:XAML文件中的图像。

  • 这个答案拯救了我的一天。当您实现 WebRequest 类时,还要覆盖 Icredentials。 (2认同)