OnDownloadStringCompleted无法识别URI前缀

时间:2011-08-09 22:17:22

标签: c# web-services ihttphandler

我有一个问题,简单的方法whch从asp.net 4 ashx获取字符串。我正在运行来自此asp.net应用程序托管的silverlight应用程序的方法。

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以获取异常详细信息。   堆栈跟踪:        w System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()        w System.Net.DownloadStringCompletedEventArgs.get_Result()        w MefPlugins.MainPage.client_DownloadStringCompleted(Object sender,DownloadStringCompletedEventArgs e)        w System.Net.WebClient.OnDownloadStringCompleted(DownloadStringCompletedEventArgs e)        w System.Net.WebClient.DownloadStringOperationCompleted(Object arg)   InnerException:System.Net.WebException        Message = WebClient请求期间发生异常。        InnerException:System.NotSupportedException             Message =无法识别URI前缀。             堆栈跟踪:                  w System.Net.WebRequest.Create(Uri requestUri)                  w System.Net.WebClient.GetWebRequest(Uri地址)                  w System.Net.WebClient.DownloadStringAsync(Uri地址,对象userToken)             InnerException:

哪里可能是个错误?这是http://www.galasoft.ch/sl4u/code/chapter20/20.02-Mef/MefPlugins.zip

的示例

2 个答案:

答案 0 :(得分:3)

错误的原因在于哪个项目是作为启动项目选择的启动对象。

当您的启动项目是 MefPlugins 项目(Silverlight项目)时,项目设置指示应动态创建网页以托管您的Silverlight应用程序(右键单击项目,选择属性并转到Debug选项卡)。

您遇到的问题与用作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,调试Web服务器,甚至是某些自己的实现)的扩展,它们不是是Silverlight客户端的一部分。

答案 1 :(得分:1)

我怀疑问题是你传给DownloadStringAsync的Uri是一个相对的Uri。即:“file://PluginsService.ashx”是相对于当前目录的。您可能需要绝对的Uri(即完全限定的路径名​​),如“file:// C:\ projects \ test \ PluginsService.ashx”。