我正在构建Silverlight / Windows Azure应用程序。
我正在尝试从Web角色公开的REST API中读取一些简单数据。
private void MainPage_Loaded(object sender, RoutedEventArgs args)
{
// ...
WebClient data = new WebClient();
data.DownloadStringCompleted += new DownloadStringCompletedEventHandler(data_DownloadStringCompleted);
data.DownloadStringAsync(new Uri("localhost:88/expenseservice.svc/expenses"));
}
void data_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
return;
}
XElement xmlStrs = XElement.Parse(e.Result);
strBox.ItemsSource = xmlStrs.Descendants("ArrayOfstring");
}
不幸的是,它始终失败并显示以下消息:
NotSupportedException:“URI前缀 不被承认。“
我在这里做错了什么?是抱怨“localhost”吗?是否有更简单的方法来访问我自己的解决方案中公开的服务? (这可能是“添加服务参考”的用途吗?)
更新将http://
添加到URI可使其正常运行。 (但显然,一旦部署到Azure,这将无效)。
仅使用相对路径,如/expenseservice.svc/expenses
失败,但出现以下异常:
System.UriFormatException: Invalid URI: The format of the URI could not be determined.
at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
at System.Uri..ctor(String uriString)
at ExpenseCalc_SilverLight.MainPage.MainPage_Loaded(Object sender, RoutedEventArgs args)
at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)
答案 0 :(得分:1)
您为Uri构造函数指定的uri字符串无效,它应该看起来像
new Uri("http://localhost:88/expenseservice.svc/expenses")
但我确信它在Azure结构上都不会起作用:你不能硬编码端口信息,因为它们可以改变。嗯此外,我相信它不会在结构上运行,因为SL应用程序在客户端运行良好..客户端上的localhost是客户端,而不是服务器
你应该使用相对或绝对uri而不指定主机。
new Uri("/expenseservice.svc/expenses",UriKind.Relative)
应该这样做。