如何将Silverlight应用程序连接到WCF服务?

时间:2010-08-24 18:58:33

标签: c# silverlight wcf web-services linq-to-sql

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

我测试了我的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没有加载......但我不知道这意味着什么。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

根据MSDN<services>标记应位于<system.serviceModel>标记内。只需将整个块复制到那里。

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

除非您创建WCF Data Service / OData,否则Silverlight无法通过WCF服务神奇地“查询”数据库。要以直接的方式从数据库获取数据到Silverlight客户端,您需要在WCF服务中创建根据WCF方法的in-parameters查询数据库的方法,将其打包为适当的数据结构({{1在链接中的示例中)并将结果返回给Silverlight客户端。

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

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

答案 2 :(得分:0)

您可以尝试这种方式:

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

简单易行。