我想知道如何在Silverlight应用程序中使用普通的WCF服务(不支持Silverlight的WCF服务)。这是我试过的
basicHttpBinding
文件web.config
clientaccesspolicy.xml
和crossdomain.xml
个文件放在wwwroot
文件夹中。但即使我无法使用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.ClientBase1.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服务的最佳方式是什么?一个例子可以帮助我。
谢谢。
答案 0 :(得分:0)
据我所知,您可能会遇到问题的原因:
您可以使用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>