【问题标题】:How do I connect my Silverlight app to a WCF Service?如何将我的 Silverlight 应用程序连接到 WCF 服务?
【发布时间】:2010-08-24 18:58:33
【问题描述】:

我一直在寻找这个答案,我发现的只是这个link,但是当我尝试按照教程进行操作时,我失败了。我需要将我的 Silverlight 应用程序连接到数据库,只是为了显示来自特定表的信息。因为我不想为我的页面和我的 Silverlight 应用程序使用相同的 ORM,所以我创建了一个新的 WCF Web 服务项目,并在其中创建了我的 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 没有加载……但我不知道那是什么意思。

【问题讨论】:

  • 您应该将标题更改为“如何将 Silverlight 连接到 WCF 服务?”因为这与数据库无关,而是客户端服务器通信。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据MSDN&lt;services&gt; 标签应该在您的&lt;system.serviceModel&gt; 标签内。只需将整个块复制到那里即可。

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

    Silverlight 无法通过 WCF 服务神奇地“查询”数据库,除非您创建 WCF Data Service/OData。要以直接的方式从数据库获取数据到您的 Silverlight 客户端,您需要在 WCF 服务中创建根据 WCF 方法的参数查询数据库的方法,将其打包成合适的数据结构 (List&lt;Customer&gt;在您链接的示例中)并将结果返回给 Silverlight 客户端。

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

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

    【讨论】:

    • 这解决了第一部分,我猜,但我的问题的第二部分仍然没有答案。我以前从未使用过这种东西,对此我有点困惑。你为什么说它与数据库无关,如果它是一种链接它们的方式?
    • @Bruno:该错误与您的数据库无关,无论您是否有数据库,您都会收到该错误。我用更多细节编辑了我的答案。您也可以尝试启动您的项目,看看是否有任何与 web.config 相关的错误或与您的服务相关的其他错误。
    • 让你感到困惑的是WCF的角色。 WCF 不仅仅是一个数据库接口,它更像是一个通用服务/服务器。它可以用于很多事情。从数据库读取数据只是您可以使用 WCF 服务执行的众多操作中的一件事。
    【解决方案3】:

    你可以试试这个方法:

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

    简单易行。

    【讨论】:

    • 我已经这样做了,但是没有用。我获取数据库信息的方法没有到达我的处理程序。此外,代码略有不同:webService.GetDataCompleted += new EventHandler(webService_GetDataCompleted);
    • 为了您的利益,我希望您不要忘记在事件的初始化下方添加以下行:webService.GetDataASync();
    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多