我有一个问题,简单的方法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
的示例答案 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”。