locked
OutOfBrowserでファイルダウンロードができない RRS feed

  • 質問

  • ClientBinの中にXMLファイルを置いて、App.xaml.csの中で読み込む実装をしています。

    Browser内実行ではうまくいったのですが、OutOfBrowser設定にして実行すると、Completedに返ってこなくなってしまいました。

    OutOfBrowserの場合だと、方法が違うのでしょうか?
    よろしくお願いいたします。

    以下がソースコードです。

    Uri filePath = new Uri("Sample.xml", UriKind.Relative);
    WebClient webClient = new WebClient();
    webClient.UseDefaultCredentials = true;
    webClient.DownloadStringCompleted += ServiceList_DownloadStringCompleted;
    webClient.DownloadStringAsync(filePath);

     

    2010年9月16日 8:32

すべての返信

  • Browser内実行ではうまくいったのですが、OutOfBrowser設定にして実行すると、Completedに返ってこなくなってしまいました。

    2点確認したいことがあります。

    1. DownloadStringCompleted イベントが発生しないということですか?それとも、イベントは発生するけど、イベント引数の Result プロパティから XML の内容が取得できないということですか?
    2. もしイベントはちゃんと発生している場合、イベント引数の Error の内容はどうなっていますか?

    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年9月16日 8:54
  • 説明不足ですみません。
    ご返信ありがとうございます。

    webClient.UseDefaultCredentials = true;
    の場合、DownloadStringCompletedイベントが発生しません。

    webClient.UseDefaultCredentials = false;
    の場合、DownloadStringCompletedイベントは発生するのですが、Errorになります。
    Errorの内容は、
    [System.Net.WebException] = {System.Net.WebException: WebClient 要求で例外が発生しました。 ---> System.NotSupportedException: BrowserHttpWebRequest は、カスタムの資格情報をサポートしていません。
       場所 System.Net.Browser.BrowserHttpWebRequest.set_UseDefaultCredentials(Boolean value)
       場所 System.Net.WebClient.GetWebReq...
    で、InnerExceptionには
    「BrowserHttpWebRequest は、カスタムの資格情報をサポートしていません。」
    となっています。

    よろしくお願いいたします。

     

    2010年9月16日 9:00
  • ブラウザ外実行のときは Silverlight から DOM を触る機能が無効になっているので、もしかしたらそのせいで相対アドレスで指定した XML ファイルが見つからないのかもしれません。推測ですが。。。

    WebClient client = new WebClient();
    client.BaseAddress = "http://localhost:49260/";
    client.DownloadStringCompleted += (s, ea) =>
    {
      if (ea.Error != null)
      {
        MessageBox.Show(ea.Error.Message);
        return;
      }
      Deployment.Current.Dispatcher.BeginInvoke(() =>
      {
        _textBox.Text = ea.Result;
      });
    };
    
    

    という風に、Silverlight をホストしているWebページの URI をベースアドレスに指定してやると取得できるかもしれません。


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年9月17日 1:16
  • まったく試したわけではないのでハズレかもしれませんが、事前に
    WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
    を呼び出すというのはどうでしょうか?
    http://msdn.microsoft.com/ja-jp/library/dd920295(VS.95).aspx

    out of browser のときは文字通りブラウザが無いわけですが、例外を見ると BrowserHttpWebRequest が使われているのが気になりました。


    青柳 臣一 (Shinichi Aoyagi)
    2010年9月17日 1:23
  • ご返信ありがとうございます。

    やってみたのですが、現象は変わらず、うまくいきませんでした。。

    2010年9月17日 1:36
  • ご返信ありがとうございます。

    同じサイトを見て、試してみていたのですが、うまくいきませんでした。

    OutOfBrowserのときは、WebClientでの接続はできないのでしょうか・・

    2010年9月17日 1:42
  • DownloadStringCompleted イベントが発生しないのが気になります。XMLファイルのURLは間違っていませんか?

    あと、Silverlightを動かしているブラウザは何でしょうか?IE以外のブラウザで、DownloadStringCompleted イベントが発生しないケースがあったみたいです。

    http://www.arugoworks.net/blog/?p=569

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年9月21日 21:39
  • ご返信ありがとうございます。

    IEで試しています。
    URLも、Browser内実行だとうまくいくので、間違ってないのですが・・。

    App.xaml.csがよくないのでしょうか。。
    RootVisualに設定したXaml.csの中だと、正常にWebClientを呼んでイベントを発生させることができました。

    2010年9月24日 9:41
  • 問題の現象が発生するのは、Visual Studio のデバッグ実行時ですか?それとも、デバッグなしで実行したときですか?

    試しているときに、デバッグなしで実行したとき WebClient の DownloadStringCompleted イベントが発生しないことがありました。そのときは、Silverlight アプリをホストする ASP.NET の Web アプリが起動していないことが原因で、Web アプリを起動してやると、XML ファイルの内容の取得できました。


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年9月28日 3:13
  • 現在、同じ様な問題でなやんでいるので、こちらに追加質問させて頂きました。(他の方の質問に追加するのは、初めてで色々間違っていたら申し訳ありません。)

    kzchocoさん、この問題は解決したのでしょうか?解決されたのであれば、その方法をこちらに載せて頂く事は可能ですか?

    現在、私もファイルのダウンロードを行うロジックを組んでいます。(Webフォームを一つ追加して、そこからボタンイベントでダウンロードメソッドを追加しています。)

    現在のロジックではOOBでは動きません。(.webのプロジェクトをスタートアップにすると動きますが)。

    エラーは【DOM/スクリプト ブリッジは無効になっています。】と出ます。

    中村さん、>ブラウザ外実行のときは Silverlight から DOM を触る機能が無効になっているので、もしかしたらそのせいで相対アドレスで指定した XML ファイルが見つからないのかもしれません。との事ですが、WebClientから行うと、テキストの内容は拾えるのですが、ダウンロードが出来ません。

    行いたい事は、サーバー側に配置したテキスト(.txt)(位置、ファイル名等は固定で持っています)をクライアント側にダウンロードしたいのです。oob環境以外なら出来ているので、なんとかoob環境でも実現したいと思います。 ヒント等の助言を頂ければと思います。

    ①非oob環境で実現可能なダウンロードメソッド
    
     string uristring = @"http://localhost:1355/Download.aspx";
          Uri uri = new Uri(uristring);
          HtmlPage.Window.Navigate(uri);
    ②WebClientを使用したパターン
     (テキストの内容はリストボックスに表示されます。)
    
    const string Downloadaspx = "http://localhost:1355/Download.aspx";
    
     void Button1Clicked(object sender, EventArgs e)
        {      
          WebClient wc = new WebClient();
          wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
          wc.DownloadStringAsync(new Uri(Downloadaspx));            
        }
    
    
    
        void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
          if (e.Error == null)
          {        
            MyPage mp = new MyPage();
            mp.ListBox1.Items.Add(e.Result);
            mp.Show();
          }
        }

      oob環境でのダウンロードダイアログの表示方法のヒントや参考URLでもかまいません。ご教授願います。

    【環境】

    ・Silverligh4 VisualStudio2010 C# WincowsXp

    2011年7月5日 4:34