2011-08-09 69 views
1

我得與單純方法的問題界河從asp.net ashx的4串得到。我正在運行由該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。 堆棧跟蹤: 瓦特System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() 瓦特System.Net.DownloadStringCompletedEventArgs.get_Result() 瓦特MefPlugins.MainPage.client_DownloadStringCompleted(對象發件人,DownloadStringCompletedEventArgs E) 瓦特System.Net.WebClient.OnDownloadStringCompleted(DownloadStringCompletedEventArgs E) 瓦特System.Net.WebClient.DownloadStringOperationCompleted(對象ARG) 的InnerException信息:System.Net.WebException 消息=一個Web客戶端請求期間發生異常。 InnerException:System.NotSupportedException Message =無法識別URI前綴。 堆棧跟蹤: 瓦特System.Net.WebRequest.Create(URI requestUri) 瓦特System.Net.WebClient.GetWebRequest(URI地址) 瓦特System.Net.WebClient.DownloadStringAsync(URI地址,對象userToken) 的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工程中的(Silverlight項目)T,項目設置指示網頁應該是動態創建以託管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文件需要某種形式的http偵聽器,用於將請求從端口路由到您的網頁.ashx。偵聽器可以是IIS或開發Web服務器之類的Web服務器,也可以是您自己實現的某個偵聽器。

要解決該問題,請使用MefPlugins.Web項目啓動項目並將MefPluginsTestPage.aspx設置爲啓動頁面。現在_baseAddress應該類似於http://localhost:6584/

當此基地址現在用於查找PluginsService.ashx頁面時,它將導致資源的正確URI(在我們的例子中爲http://localhost:6584/PluginsService.ashx)。

一般.ashx文件擴展到Web服務(IIS,調試網絡服務器,甚至一些自己的實現),他們是Silverlight客戶端的一部分。

1

我懷疑問題在於你傳給DownloadStringAsync的Uri是相對的Uri。即:「file://PluginsService.ashx」是相對於當前目錄。您可能需要像「file:// C:\ projects \ test \ PluginsService.ashx」中的絕對Uri(即完全限定的路徑名​​)。

+0

問題在於xap文件的基本URI,這取決於哪個解決方案是啓動項目。看到我的答案。 – AxelEckenberger