2013-02-08 2 views
0

정상적인 .Net WebClient/WebRequest을 사용하여 "다운로드"(읽기 :로드 또는 바이트 배열로로드)해야하는 data : URI가 있습니다. 어떻게해야합니까?데이터에서 "다운로드"하는 방법 : URIs?

SVG에서 생성 된 XAML 파일을 표시하고 싶습니다.이 이미지에는 data : URI를 사용하는 일부 이미지가 포함되어 있습니다. 항상 XAML을 구문 분석하고 이미지를 디스크에 저장 한 다음 XAML을 변경하여 파일을 가리 키지 않습니다. WPF는 내부적으로 그 이미지를 얻기 위해 WebRequest을 사용한다고 생각합니다.

답변

2

WebRequest.RegisterPrefix()을 사용해도됩니다. WebResponse 사용자 지정을 반환하는 사용자 지정 WebRequest을 반환하는 IWebRequestCreate을 구현해야하며, 마지막으로 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); 
    } 
} 

이 형식은 base64 인코딩 만 지원하지만 쉽게 URI 인코딩을 지원할 수 있습니다.

WebRequest.RegisterPrefix("data", new DataWebRequestFactory()); 

을 그리고 네,이 데이터를 입수 작동합니까 :

당신은 다음과 같이 등록합니다 XAML 파일에 이미지를.

+1

이 답변으로 하루가 절약되었습니다. 또한 WebRequest 클래스를 구현할 때 Icredentials를 재정의합니다. – sms