1

我从 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 未被用户代码处理 Message=操作过程中发生异常,导致结果无效。检查 InnerException 以获取异常详细信息。StackTrace: 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 前缀。

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

4

2 回答 2

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、调试 Web 服务器,甚至是自己的实现)的扩展,它们不是silverlight 客户端的一部分。

于 2011-08-11T23:02:23.240 回答
1

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

于 2011-08-11T21:16:47.943 回答