你能在Windows Phone 7上使用WCF服务吗?

9
我只能在网上找到一些人提到这个问题,他们似乎很简单地通过添加服务引用来解决了。然而,当我尝试为我的WCF服务添加服务引用时(我的WCF服务在普通控制台应用程序中工作正常,因此我已经排除了WCF的问题),我收到了一系列错误信息。
警告5:自定义工具警告 - 没有与Silverlight 3兼容的终结点。除非通过构造函数提供终结点信息,否则生成的客户端类将无法使用。 警告6:自定义工具警告 - 目标调用的异常已被抛出。 警告2:自定义工具警告 - 无法导入wsdl:portType。详细信息:在运行WSDL导入扩展时引发了一个异常:System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:无法从程序集'System.Runtime.Serialization, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'中加载类型'System.Runtime.Serialization.DataContractSet'。 警告4:自定义工具警告 - 无法导入wsdl:port。详细信息:在运行WSDL导入扩展时出错,该wsdl:port取决于wsdl:binding。 警告3:自定义工具警告 - 无法导入wsdl:binding。详细信息:在运行WSDL导入扩展时出错,该wsdl:binding取决于wsdl:portType。 错误7:自定义工具错误 - 无法为服务引用“ServiceReference”生成代码。请查看其他错误和警告消息以获取详细信息。
我觉得第一个错误提到Silverlight 3很奇怪,因为我刚刚完全卸载和重新安装了所有开发工具,以确保我正在使用最新版本的.NET和Silverlight。
这些错误看起来类似于如果我尝试创建一个新的Silverlight项目并且不勾选“启用WCF RIA服务”复选框所看到的错误。如果这确实是问题,我还没有找到任何启用它的方法适用于WP7。
非常感谢您这些博学的男士(和女士)对我的帮助。
7个回答

7

我遇到了完全相同的错误,并将集合类型更改为System.Collections.Generic.List而不是System.Collections.ObjectModel.ObservableCollections。这很奇怪,因为我甚至没有勾选“始终生成消息契约”的框。

希望这可以帮到您。


7

嗯,我刚刚通过取消“重用类型...”框中的服务引用配置并更新,成功生成了服务配置文件。不确定这是否能帮到您?


+1,我之前在使用微软翻译服务时遇到了这个问题,这个方法似乎解决了它。 - Ana Betts

7
请记住,即使是专门用于 Silverlight 3 的 Windows Phone 版本,Silverlight 也不能与所有 WCF 服务绑定/端点一起使用,而只支持其中的一个子集(例如,不包括 WS-HTTP 绑定)。你最简单的选择是在 Visual Studio 中使用“Silverlight-enabled WCF Service”模板(在添加/新项/Silverlight下)为 Silverlight 应用程序创建 WCF 服务。
这篇来自 Silverlight WCF 团队博客的博客文章(http://blogs.msdn.com/b/silverlightws/archive/2009/03/20/what-s-new-with-web-services-in-silverlight-3-beta.aspx)应该会让您对可能性有所了解。您可能想查看整个博客(http://blogs.msdn.com/b/silverlightws/),因为它有一些有趣的 how-to 和 gotcha 文章。

1

我在开发一个带有Windows Azure后端的Windows Phone 7应用程序时遇到了这个问题。Windows Azure本地开发环境要求您以管理员身份运行。感谢Ken! - markti

0

答案是肯定的,您可以从WP7访问WCF服务,正如之前的帖子所指出的那样,它仅支持WS-HTTP。如果您正在尝试为Silverlight应用程序访问WCF服务,则需要执行以下几个步骤:

  1. 将您的Silvleright Toolkit更新到最新版本。从Codeplex获取它。
  2. 在您的Silverlight项目中添加对Microsoft.ServiceModel.DomainServices.Hosting的引用。
  3. 进入Web.Config并添加soap端点:

     
    <domainServices>
        <endpoints>
            <add name="Soap"
                 type="Microsoft.ServiceModel.DomainServices.Hosting.SoapXmlEndpointFactory,
    Microsoft.ServiceModel.DomainServices.Hosting"
            />
        </endpoints>
    </domainServices> 

    不要担心“system.serviceModel”警告;忽略它

  4. 添加服务引用。“但是,哪个uri?”你问。您的服务地址是这个:[ria服务的命名空间]-[ria服务的类名].svc其中 . 被替换为 - 。因此,如果我在我的SL应用程序的Services目录中创建了我的服务,并且命名空间看起来像这样:

    namespace myApplication.Web.Services
    {
        [EnableClientAccess()]
        public class SuperService ....
    

那么地址就是:

http://localhost[:port]/Services/myApplication-Web-Services-SuperService.svc

让工具来完成剩下的工作。如果出现一些奇怪的错误,那么保存并关闭VS,重新启动即可解决问题。

我希望这就是你要找的答案。


0

是的,这是一个奇怪的错误。你可以返回字符串、整数等,但是像ArrayList等其他东西会出现这个错误。

你的代码没有问题,只是VS有一个bug。微软已经修复了它(检查服务包),但如果你正在为Windows Phone 7编程,这个bug仍然存在。

你需要删除服务,然后删除Bin和Obj文件夹。保存并关闭VS。然后重新启动项目,添加服务引用(不要调试/运行应用程序)。哦,是的,首先备份。应该没问题。每次更新服务时,你可能需要重复此过程。

如果这样做不能解决问题,你可能需要打开一个新项目或者如果可能的话重新创建Web服务。


0
以下解决了我的问题:
我创建了一个新的WP7项目,添加了wcf服务。
然后我将服务引用文件夹复制到我的项目目录中,这个目录导致了我遇到的问题,并重新启动Visual Studio并构建应用程序。
你可能会在Reference.cs文件中得到命名空间错误;只需将命名空间更改为当前项目的命名空间即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接