如何在silverlight app中使用WCF

时间:2011-12-31 10:00:23

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

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

  1. 我创建了一个简单的普通WCF服务
  2. 我将绑定更改为basicHttpBinding文件
  3. 中的web.config
  4. 我已将clientaccesspolicy.xmlcrossdomain.xml个文件放在wwwroot文件夹中。
  5. 但即使我无法使用WCF服务。我得到了这个例外

      

    System.ServiceModel.CommunicationException未被用户代码
    处理   Message =尝试向URI发出请求时发生错误   'HTTP://localhost/HWT/HelloWorldService.svc'。这可能是由于   试图在没有正确的情况下以跨域方式访问服务   适当的跨域策略,或不适合SOAP的策略   服务。您可能需要联系服务所有者进行发布   跨域策略文件,并确保它允许与SOAP相关的HTTP   要发送的标头。使用内部也可能导致此错误   Web服务代理中的类型,而不使用   InternalsVisibleToAttribute属性。请查看内部异常   了解更多详情   堆栈跟踪:
      在System.ServiceModel.AsyncResult.End [TAsyncResult](IAsyncResult结果)
      at System.ServiceModel.Channels.ServiceChannel.EndCall(String action,Object [] outs,IAsyncResult results)
      在System.ServiceModel.ClientBase 1.ChannelBase 1.EndInvoke(String   methodName,Object [] args,IAsyncResult result)
      at ServiceRef.HelloWorldServiceClient.HelloWorldServiceClientChannel.EndGetName(IAsyncResult)   结果)
      at ServiceRef.HelloWorldServiceClient.TestSilClient.ServiceRef.IHelloWorldService.EndGetName(IAsyncResult result)
      在TestSilClient.ServiceRef.HelloWorldServiceClient.OnEndGetName(IAsyncResult)   结果)
      在System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult)   结果)

         

    InnerException:System.Security.SecurityException
      消息= “”
      堆栈跟踪:
      在System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback)   beginMethod,Object state)
      在System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult)   asyncResult)
      at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)

         

    InnerException:System.Security.SecurityException
      消息=安全错误。
      堆栈跟踪:
      在System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult)   asyncResult)
      在System.Net.Browser.BrowserHttpWebRequest。<> c_ DisplayClass5.b _4(Object   sendState)
      在System.Net.Browser.AsyncHelper。<> c_ DisplayClass4.b _1(Object   sendState)

    任何人都可以解释在Silverlight应用中使用普通WCF服务的最佳方式是什么?一个例子可以帮助我。

    谢谢。

2 个答案:

答案 0 :(得分:0)

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

  1. 错误构造的政策文件
  2. 错误放置策略文件(如果有的话,应放在托管您的Web服务的Web应用程序的根文件夹中,而不是在services文件夹中)
  3. 您可以使用ie Fiddler 检查您的SL应用程序是否请求任何策略文件。如果您看到下载了一个策略文件但该应用程序不能正常工作,则可能是原因。如果没有请求文件,你可能放错了位置(如第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

答案 1 :(得分:0)

尝试放松您的跨域文件(仅为了测试)以验证是否是问题。在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>