【问题标题】:How can I use web service from Silverlight app?如何使用 Silverlight 应用程序中的 Web 服务?
【发布时间】:2011-11-04 05:59:42
【问题描述】:

我正在尝试从 silverlight 应用程序中的 Web 服务获取数据。不幸的是,silverlight 应用程序(必应地图应用程序)在尝试连接时只是挂起。

我在控制台应用程序中使用相同的代码,它工作得很好。

我需要在 silverlight 中做些什么才能让它工作吗?我没有遇到任何异常 - 它只是挂起。

我的服务和客户端代码基于此示例 http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication

问题和疑问:

1.为什么我不能在我的 sliverlight 代码中设置断点?

2。如何从 silverlight 应用程序成功调用 WCF 服务?(指向 SIMPLE 工作示例的链接会很棒 - 我似乎找到的所有示例似乎都非常先进(RIA、Duplex 等)其中许多还显示xml 和其他非 C#“代码”——坦率地说,我不知道它们是做什么的以及它们与项目、代码和服务的关系。

(显然我对WCF和silverlight一无所知)

根据对代码的要求:

[ServiceContract]
public interface ILGSMapServer
{
    [OperationContract]
    List<double> GetLatitudes();
}    


public class TreeWorkClient
{ 
ChannelFactory<ILGSMapServer> httpServer;        
public ILGSMapServer httpProxy;        

public TreeWorkClient()
{
    httpServer = new ChannelFactory<ILGSMapServer>(new BasicHttpBinding(), new EndpointAddress("http://localhost:8000/GetLatitudes"));
    httpProxy = httpServer.CreateChannel();
}        

public List<TreeWorkItem> GetLocations()
{
    List<double> lats = httpProxy.GetLatitudes();


    //...  do stuff in code
    return ret;
}

}

【问题讨论】:

  • 请实际显示您用来调用服务的代码。
  • 很确定你需要 AsyncPattern = true 在你的 OperationContract for silverlight
  • @MerickOWA - 我不知道那是什么。那在哪里/那是什么?如何设置?
  • @Tim 我发布了一个答案,其中显示了您需要更改的示例

标签: c# silverlight wcf


【解决方案1】:

我同意 John Saunders 的观​​点 - 如果您发布了客户端代码,会更容易回答这个问题。

不过,作为猜测,从 Silverlight 应用程序调用服务的一个常见问题是 Silverlight 对跨域调用的限制。

总之,如果您的服务与 Silverlight 应用程序的源站点位于不同的域中,您需要在服务位置创建客户端访问策略文件。

查看详情:

http://msdn.microsoft.com/en-us/library/cc197955(v=vs.95).aspx

【讨论】:

  • 我不知道这个答案是什么意思。所有这些都在本地机器上 - 我现在只是想测试一下。我对“服务”/“服务器”的配置一无所知 - 我只是以编程方式创建了服务。
  • 啊,对不起蒂姆。我没有意识到这都是本地的。我认为该服务与从 (localhost:8000) 提供 silverlight 应用程序的位置相同?
  • 有两种不同的解决方案/exes。一个是为 WCF 提供服务的应用程序,位于 localhost:8000 上。另一个是 bing 地图 silverlight 应用程序。 localhost:56888/BingTestPage.aspx.
【解决方案2】:

鉴于您的示例代码,您应该会看到

System.InvalidOperationException:合同“ILGSMapServer” 包含不支持的同步操作 银光。将操作拆分为“开始”和“结束”部分并设置 将 OperationContractAttribute 上的 AsyncPattern 属性设置为“true”。 请注意,您不必在服务器上进行相同的更改。

您需要将服务合同更改为以下内容

  [ServiceContract]
  public interface ILGSMapServer {

    [OperationContract( AsyncPattern = true )]
    IAsyncResult BeginGetLatitudes( AsyncCallback callback, object context );
    List<double> EndGetLatitudes( IAsyncResult result );
    }

这也意味着您需要在 GetLocations() 函数中执行完全不同的操作,因为此函数将在返回 Web 的结果之前返回。

尝试查看示例here

其他选项涉及使用“添加服务引用”而不是在代码中手动定义它。

【讨论】:

  • 谢谢。我看不出有任何例外。我尝试关注该链接/内容。我搞不清楚了。我在 C# 代码中更改了服务合同,但之后我完全迷失了。我想我只需要回到 C++ 编程......
  • @Tim WCF 是一个大型复杂但非常灵活的野兽。 Silverlight 强制您异步执行所有操作。当 WCF 正在检索数据时,您不能阻止 UI。我建议学习这种模式并了解它的作用。
  • @MerrickOWA - 谢谢 - 我对线程或异步行为没有任何问题 - 对我来说,问题是 .NET、c#、工具、WCF、Silverlight、大量使用 xml 等都是新的大部头书。我一直在查看和阅读的网站似乎对我正在努力解决的问题有很多知识和经验。我真的很感激帮助。我接近让异步与我的代码一起工作......
【解决方案3】:

我相信您需要在 WCF 服务上拥有此属性,SL 才能使用它:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

至于调试 - 你可以调试 Silverlight,尝试使用 IE,它最自然的 SL 调试浏览器(遗憾)。

一旦你开始调试,当你捕捉到跨域异常或其他异常时,你会更清楚什么是错误的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多