繁体   English   中英

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

[英]How can I use web service from Silverlight app?

我正在尝试从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;
}

}

我同意约翰·桑德斯(John Saunders)的观点-如果发布了客户端代码,回答这个问题会更容易。

但是,作为猜测,从Silverlight应用程序调用服务的常见问题是Silverlight对跨域调用施加的限制。

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

详情请参见:

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

给定您的示例代码,您应该会看到

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结果之前返回。

尝试看一下这里的例子。

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

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

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

至于调试-您可以调试Silverlight,为此,请尝试使用IE,它是最自然的SL调试浏览器(可悲)。

一旦开始调试,当您捕获跨域异常或其他异常时,将会更清楚地发现出了什么问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM