如何使用Silverlight应用程序中的Web服务?

时间:2011-11-03 19:22:54

标签: c# silverlight wcf

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

我在控制台应用程序中使用相同的代码,它可以正常工作。

我需要在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;
}

}

3 个答案:

答案 0 :(得分:2)

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

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

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

详情请见:

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

答案 1 :(得分:1)

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

  

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

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

  [ServiceContract]
  public interface ILGSMapServer {

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

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

尝试查看示例here

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

答案 2 :(得分:0)

我相信你需要在WCF服务上使用这个属性让SL使用它:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

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

一旦你开始调试,当你捕获跨域异常或其他一些异常时,它会更清楚是错误的。