从Silverlight中使用本地托管的REST?

时间:2010-10-09 07:21:32

标签: c# visual-studio silverlight rest

我正在构建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)

1 个答案:

答案 0 :(得分:1)

您为Uri构造函数指定的uri字符串无效,它应该看起来像

new Uri("http://localhost:88/expenseservice.svc/expenses")

但我确信它在Azure结构上都不会起作用:你不能硬编码端口信息,因为它们可以改变。嗯此外,我相信它不会在结构上运行,因为SL应用程序在客户端运行良好..客户端上的localhost是客户端,而不是服务器

你应该使用相对或绝对uri而不指定主机。

new Uri("/expenseservice.svc/expenses",UriKind.Relative)

应该这样做。