【问题标题】:How to consume WCF in silverlight app如何在 Silverlight 应用程序中使用 WCF
【发布时间】:2011-12-31 10:00:23
【问题描述】:

我想知道如何在我的 Silverlight 应用程序中使用普通的 WCF 服务(不是启用 Silverlight 的 WCF 服务)。这是我尝试过的

  1. 我创建了一个简单的普通 WCF 服务
  2. 我在web.config 文件中将绑定更改为basicHttpBinding
  3. 我已将clientaccesspolicy.xmlcrossdomain.xml 文件放在wwwroot 文件夹中。

但即使我无法使用 WCF 服务。我得到了这个例外

System.ServiceModel.CommunicationException 未被用户代码处理
消息=尝试向 URI 发出请求时发生错误 'http://localhost/HWT/HelloWorldService.svc'。这可能是由于 试图以跨域方式访问服务而没有适当的 跨域策略,或不适合 SOAP 的策略 服务。您可能需要联系服务的所有者来发布 跨域策略文件并确保它允许与 SOAP 相关的 HTTP 要发送的标头。此错误也可能是由于使用内部 键入 Web 服务代理而不使用 InternalsVisibleToAttribute 属性。请查看内部异常 了解更多详情。
堆栈跟踪:
在 System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult 结果)
在 System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult 结果)
在 System.ServiceModel.ClientBase1.ChannelBase1.EndInvoke(字符串 方法名、对象[] 参数、IAsyncResult 结果)
在 ServiceRef.HelloWorldServiceClient.HelloWorldServiceClientChannel.EndGetName(IAsyncResult 结果)
在 ServiceRef.HelloWorldServiceClient.TestSilClient.ServiceRef.IHelloWorldService.EndGetName(IAsyncResult 结果)
在 TestSilClient.ServiceRef.HelloWorldServiceClient.OnEndGetName(IAsyncResult 结果)
在 System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult 结果)

内部异常:System.Security.SecurityException
消息=""
堆栈跟踪:
在 System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback 开始方法,对象状态)
在 System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult 异步结果)
在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult 结果)

内部异常:System.Security.SecurityException
消息=安全错误。
堆栈跟踪:
在 System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult 异步结果)
在 System.Net.Browser.BrowserHttpWebRequest.c_DisplayClass5.b_4(Object 发送状态)
在 System.Net.Browser.AsyncHelper.c_DisplayClass4.b_1(对象 发送状态)

谁能解释在 Silverlight 应用程序中使用普通 WCF 服务的最佳方式是什么?一个例子会帮助我。

谢谢。

【问题讨论】:

  • 您能否向我们展示您的web.config 文件中的相关部分? (<system.serviceModel> 部分内的任何内容)。这是一个安全例外 - 所以我认为这与您的网络服务期望用户进行身份验证的方式有关。
  • 嗯,否则你能连接到服务吗?您可以使用 WcfTestClient 调用它吗?如果您设法在同一个站点上同时拥有 silverlight 应用程序和服务,您可以调用它吗? (这是我开始关注@marc_s 观察的地方)

标签: wcf silverlight-4.0 wcf-security wcf-client


【解决方案1】:

据我所知,您的问题的可能原因:

  1. 错误构建的策略文件
  2. 错误放置的策略文件(应放置在托管您的 Web 服务的 Web 应用程序的根文件夹中,而不是放在 services 文件夹中,如果您有的话)

您可以使用 Fiddler 来检查您的 SL 应用程序是否请求任何策略文件。如果您看到下载了策略文件但应用程序无法正常工作,则可能是第 1 点的原因。如果没有请求文件,您可能放错了位置(如第 2 点所示)。

有可能根本不使用策略文件。如果您的 Web 服务托管在与 Silverlight 应用程序相同的 Web 应用程序中,您可以在客户端的端点配置 (.ClientConfig) 中将相对路径传递给 WS,并且不需要跨域/策略文件。例如,不要使用address="http://localhost/Services/ExampleService.svc",而是使用address="../Services/ExampleService.svc" 之类的东西(取决于XAP 文件所在的文件夹)。欲了解更多信息,请查看http://msdn.microsoft.com/en-us/library/cc197941%28v=vs.95%29.aspx

【讨论】:

    【解决方案2】:

    尝试放松您的跨域文件(只是为了测试)以验证是否是问题所在。在您的 crossdomain.xml 文件中使用此代码,看看它是否有效:

    <?xml version="1.0" ?>
    <cross-domain-policy>
      <allow-access-from domain="*"/>
      <site-control permitted-cross-domain-policies="all"/>
      <allow-http-request-headers-from domain="*" headers="*"/>
    </cross-domain-policy>
    

    【讨论】:

      猜你喜欢
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 2012-05-17
      相关资源
      最近更新 更多