2010-08-24 139 views
2

我一直在寻找这个答案,所有我发现的是这link,但是当我试图按照教程,我失败了。我需要的是将我的Silverlight应用程序连接到数据库,以显示特定表中的信息。因为我不想为我的页面和我的silverlight应用使用相同的ORM,所以我创建了一个新的WCF webservice项目,并在其中创建了我的LINQ to SQL类。如何将我的Silverlight应用程序连接到WCF服务?

我测试了我的WCF服务,它工作正常,但不知怎的,我的Silverlight应用程序没有达到它。我更改了web.config文件,现在看起来如下所示。

我的web.config

<?xml version="1.0"?> <configuration> 

    <connectionStrings> 
    <add name="bd_webportosConnectionString" connectionString="Data Source=BARNEY\DEV;Initial Catalog=bd_webportos;User ID=sa;Password=Stigeo_1_adm_1" 
     providerName="System.Data.SqlClient" /> </connectionStrings> <system.web> 
    <compilation debug="true" targetFramework="4.0" /> </system.web> <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="basicHttpBindingConfig"> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Ntlm"/> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:7298/DataToSilverlight.svc" 
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1" 
      contract="DataRetrieverReference.IService1" name="BasicHttpBinding_IService1" /> 
    </client> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information 
--> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel> <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration> 

我不知道如何解决这个问题。虽然我陷入困境,但我努力继续前进,但随后又陷入了下一步,那就是将服务引用添加到我的Silverlight应用程序中。当我尝试做它说,将显示以下信息:

有从下载地址 元数据的错误。请 确认您已输入有效的 地址。

我通过WCF测试客户端测试了该服务,它工作正常,但我的silverlight应用程序无法访问它。我得到以下异常:

,同时努力使 到URI “http://localhost:7298/DataToSilverlight.svc”的请求时发生错误。 这可能是由于尝试以 以跨域方式访问服务 而没有适当的跨域策略 或者是不适合SOAP服务的 策略。您可能需要 联系 服务的所有者以发布跨域 策略文件并确保允许发送与SOAP相关的HTTP标头 。 此错误也可能是由于在Web服务 代理中使用 内部类型而不使用 InternalsVisibleToAttribute属性造成的。 请参阅 的内部例外更多详情。

你们能帮我解决这个大问题,或者甚至用另一种方式来实现我想要的吗?

我最近也发现我的crossdomain.xml没有加载......但我不知道这意味着什么。

+0

您应该将标题更改为“如何将Silverlight连接到WCF服务?”因为这与数据库无关,而是与客户端服务器通信。 – 2010-08-24 19:04:44

回答

0

根据MSDN<services>标签应位于<system.serviceModel>标签内。在那里复制整个模块。

编辑:关于连接到数据库部分。

除非您创建WCF Data Service/OData,否则Silverlight无法通过WCF服务神奇地“查询”数据库。要以简单直接的方式从数据库获取数据到Silverlight客户端,您需要在WCF服务中创建方法,该方法根据WCF方法的参数查询数据库,并将其包装在合适的数据结构中(List<Customer>例如你链接)并将结果返回给Silverlight客户端。

您收到的错误“从地址下载元数据时出错,请验证您是否输入了有效地址。”不是与数据库相关的错误,它是一个错误,告诉您无法找到您的WCF服务。无论您的WCF服务是否使用数据库,都会发生这种情况。

看起来好像WCF服务中可能存在进一步的配置错误,这也许可以解释为什么无法添加对服务的引用。你的对话框如何对应于“图3-13。添加对Web服务的引用”?您可以编辑您的问题并插入屏幕转储。

+0

我猜,这解决了第一部分,但我的问题的第二部分仍未得到答复。我从来没有从事这种事情,我对此有点困惑。为什么说它与数据库无关,如果它是一种链接它们的方式? – 2010-08-24 19:26:13

+0

@Bruno:错误与你的数据库无关,无论你是否有数据库,你都会得到错误。我更详细地编辑了我的答案。您也可以尝试启动您的项目,并查看是否存在与web.config或与您的服务相关的其他相关错误。 – 2010-08-24 20:16:42

+0

WCF的作用似乎让你感到困惑。 WCF不仅仅是一个数据库接口,它更像是一个通用的服务/服务器。它可以用于很多事情。从数据库中读取数据只是用WCF服务完成的许多事情之一。 – 2010-08-24 20:21:28

0

你可以试试这个方法:

http://www.dotnetspider.com/tutorials/Silverlight-Tutorial-315.aspx

简单和容易。

+0

我这样做了,但没有奏效。我的方法,获取数据库信息没有达到我的处理程序。此外,代码稍有不同: webService.GetDataCompleted + = new EventHandler (webService_GetDataCompleted); – 2010-08-26 16:55:52

+0

为了您的利益,我希望您不要忘记在事件初始化之后添加以下行: webService.GetDataASync(); – Sam 2010-08-26 21:25:56

+0

我没有忘记它。 – 2010-08-27 17:48:03

1

Silverlight运行在非常沙盒环境中。所以当我们想要从silverlight应用程序调用WCF服务时,我们必须在IIS的根目录和应用程序导向器中部署简单的policy.xml和crossdomain.xml。如果您从VS studio webserver运行Silverlight应用程序,并且WCF托管在VS内部Web服务器中,那么您将不会遇到此类问题。

相关问题