2011-08-09 44 views
1

私は単純にメソッドwhchがasp.net 4 ashxから文字列を取得することに問題があります。私はこのasp.netアプリケーションによってホストされているSilverlightアプリケーションから以下のメソッドを実行しています。URIプレフィックスが認識されませんOnDownloadStringCompleted

private void LoadPlugins() 
{ 
    var serviceAddress = _baseAddress 
     + "PluginsService.ashx?" 
     + DateTime.Now.Ticks; 

    var client = new WebClient(); 
    client.DownloadStringCompleted += client_DownloadStringCompleted; 
    client.DownloadStringAsync(new Uri(serviceAddress)); 
} 

void client_DownloadStringCompleted(
    object sender, 
    DownloadStringCompletedEventArgs e) 
{ 
    var plugins = e.Result.Split(
     new string[] { Environment.NewLine }, 
     StringSplitOptions.RemoveEmptyEntries); 
    foreach (var plugin in plugins) 
    { 
     AddXap(_baseAddress + plugin); 
    } 
} 

PluginsService.ashx.cs:

namespace MefPlugins.Web 
{ 
    /// <summary> 
    /// Summary description for PluginsService 
    /// </summary> 
    public class PluginsService : IHttpHandler 
    { 
     private const string PluginsFolderName = "Plugins/"; 

     public void ProcessRequest(HttpContext context) 
     { 
      //var pluginFolder = new DirectoryInfo(
      // HttpContext.Current.Server.MapPath(
      // PluginsFolderName)); 
      //var response = new StringBuilder(); 

      //if (pluginFolder.Exists) 
      //{ 
      // foreach (var xap in pluginFolder.GetFiles("*.xap")) 
      // { 
      //  response.AppendLine(
      //   PluginsFolderName + xap.Name); 
      // } 
      //} 

      var response = new StringBuilder(); 
      response.Append("test"); 
      context.Response.ContentType = "text/plain"; 
      context.Response.Write(response); 
     } 

     public bool IsReusable 
     { 
      get 
      { 
       return false; 
      } 
     } 
    } 
} 

私はエラーを取得する:

System.Reflection.TargetInvocationExceptionは メッセージ=例外が作って、運転中に発生したユーザーコードで未処理でした結果は無効です。例外の詳細については、InnerExceptionをチェックしてください。 のStackTrace:System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary(W )System.Net.DownloadStringCompletedEventArgs.get_Result(W )MefPlugins.MainPage.client_DownloadStringCompleted(オブジェクト送信者、DownloadStringCompletedEventArgs E)System.Net.WebClient.OnDownloadStringCompleted W (DownloadStringCompletedEventArgs W e) w System.Net.WebClient.DownloadStringOperationCompleted(Object arg) InnerException:System.Net.WebException メッセージ= WebClient要求中に例外が発生しました。 InnerException:System.NotSupportedException メッセージ= URIプレフィックスが認識されません。 のStackTrace:System.Net.WebClient.DownloadStringAsync(URIアドレス、オブジェクトはUserToken)W System.Net.WebClient.GetWebRequest(URIアドレス) W System.Net.WebRequest.Create(URI requestUri) WのInnerException:

どこにバグがありますか?これは、例ですhttp://www.galasoft.ch/sl4u/code/chapter20/20.02-Mef/MefPlugins.zip

+1

あなたは私がこれを尋ねるだろうと知っていました... URIプレフィックスは何ですか? '_baseAddress'はどのように見えますか? –

+1

あなたがそれにいる間。 「例外詳細のInnerExceptionを確認」の内容( – Eddy

+0

)serviceAddressが "file:////PluginsService.ashx?634485607882333736" – user278618

答えて

3

理由は、どのプロジェクトがスタートアッププロジェクトとしてスタートアップオブジェクトとして選択されているかにあります。

スタートアッププロジェクトがMefPlugins projec(シルバープロジェクト)Tである場合には、プロジェクトの設定は、Webページを動的にSilverlightアプリケーション(プロジェクトを右クリックし、[プロパティ]を選択をホストしに行くために作成されなければならないことを示していますデバッグ]タブ)。

あなたが遭遇する問題は、PluginsService.ashxファイルのプレフィックスとして使用される場所と関係します。 _baseAddressは以下のコードによってメインページコンストラクタ内で設定されます

var xapUri = App.Current.Host.Source; 
_baseAddress = xapUri.AbsoluteUri 
        .Substring(0, xapUri.AbsoluteUri.IndexOf(xapUri.AbsolutePath)) 
       + "/"; 

これは、XAPファイルのURIをベースURIを決定するために使用されることを意味します。今、プロジェクトが動的に生成されたコンテナページを使用しています - あなたのハードドライブにあり、そこから始まっています - 上記のコードはファイルシステムのルートをとります_baseAddressです。当然のことながら、コードにはPluginsService.ashxページが見つかりません。

さらに、.ashxファイルには、ポートからの要求を.ashxページにルーティングする何らかの形式のhttpリスナーが必要です。リスナーは、IISや開発WebサーバーのようなWebサーバー、または自分で実装したリスナーです。

この問題を解決するには、MefPlugins.Webがスタートアッププロジェクトをプロジェクトし、MefPluginsTestPage.aspxをスタートアップページに設定します。今度は_baseAddresshttp://localhost:6584/と類似しているはずです。

このベースアドレスがPluginsService.ashxページを見つけるために使用されると、リソースの正しいURIが得られます(ここではhttp://localhost:6584/PluginsService.ashx)。

一般的に、.ashxファイルは、Webサービス(IIS、デバッグWebサーバ、または独自の実装)の拡張であり、ではなく、のSilverlightクライアントの一部です。

1

私は問題を疑うのはあなたがDownloadStringAsyncに渡っていると思われている相対的なUriです。つまり、 "file://PluginsService.ashx"は現在のディレクトリからの相対パスです。 「file:// C:\ projects \ test \ PluginsService.ashx」のように、完全なUri(すなわち、完全修飾パス名)が必要な場合があります。

+0

問題はxapファイルのベースURIにあり、これはスタートアッププロジェクトの解決方法によって異なります。私の答えを見てください。 – AxelEckenberger

関連する問題