【问题标题】:Calling WCF Service from Silverlight从 Silverlight 调用 WCF 服务
【发布时间】:2010-09-12 10:29:02
【问题描述】:

我从 silverlight 调用本地托管的 wcf 服务,但出现以下异常。

我创建了一个clientaccesspolicy.xml,它位于我主机的路由中。

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

尝试制作时发生错误 对 URI 的请求 'http://localhost:8005/Service1.svc'。 这可能是由于跨域 配置错误。请参阅 更多细节的内部异常。 --->

{System.Security.SecurityException ---> System.Security.SecurityException: 安全错误。在 MS.Internal.InternalWebRequest.Send() 在 System.Net.BrowserHttpWebRequest.BeginGetResponseImplementation() 在 System.Net.BrowserHttpWebRequest.InternalBeginGetResponse(AsyncCallback 回调,对象状态)在 System.Net.AsyncHelper.c__DisplayClass4.b__3(Object sendState) --- 内部结束 异常堆栈跟踪 --- 在 System.Net.AsyncHelper.BeginOnUI(BeginMethod beginMethod,AsyncCallback 回调, 对象状态)在 System.Net.BrowserHttpWebRequest.BeginGetResponse(AsyncCallback 回调,对象状态)在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteSend(IAsyncResult 结果)在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnSend(IAsyncResult 结果)}

关于如何进步的任何想法?

【问题讨论】:

    标签: wcf silverlight securityexception


    【解决方案1】:

    我遇到了类似的问题,删除服务引用并重新添加它为我解决了这个问题。

    【讨论】:

      【解决方案2】:

      确保正确定义 WCF 服务的端点和绑定。从同一个应用程序调用 WCF 服务不需要跨域策略文件。

      【讨论】:

        【解决方案3】:

        不知道您的问题是否相同,但我刚刚写了一篇博文,讲述了我这个周末试图通过我的 SL 应用程序与我的控制台托管的 WCF 服务对话来实现跨域发生的主要痛苦。

        http://wallism.wordpress.com/2009/03/01/silverlight-communication-exception/

        不过,简而言之,您必须有一个 crossdomain.xml 并且没有 'headers="*"'

        Bad:
            <allow-access-from domain=""*"" headers="*" />
        
        Good:
            <allow-access-from domain=""*"" />
            <allow-http-request-headers-from domain=""*"" headers=""*"" />
        

        您可以使用“SOAPAction”代替 * 标头(无论哪种方式都可以)

        哦,当你让它工作时,你可能想让它更安全一点:-)

        祝你好运!

        【讨论】:

          【解决方案4】:

          我找到了 John Papa 所著的 Data-Driven Services with Silverlight 2 书,详细介绍了这一点。我也有同样的问题,这本优秀的书解释了这一切。

          【讨论】:

            【解决方案5】:

            我有同样的问题。我确实看到silverlight客户端应用程序成功获取了clientaccesspolicy.xml。我确实通过firefox直接请求它来确保clientaccesspolicy.xml没有格式错误。该政策是广泛开放的,与上述相同。

            现在奇怪的转折来了。如果我删除 clientaccesspolicy.xml 并添加 Flash 样式的 crossdomain.xml 策略文件,那么它可以工作。我确实通过检查网络看到了如何首先请求 clientaccesspolicy.xml 失败,然后 silverlight 回退到 crossdomain.xml。

            所以我确实有一个解决方法,但我更喜欢让 clientaccesspolicy.xml 工作,这样就没有额外的不必要的网络往返。

            有什么建议吗?

            【讨论】:

              【解决方案6】:

              我知道该服务运行正常,因为我将它添加为对基本网站的引用并且它运行正常。我会尝试使用 Fiddler,虽然由于 xaml 控件没有嵌入到网页中,它使用了内置的测试页渲染器,但存在一个小问题。

              这里是iv发现需要检查的几个指针:

              添加一个 clientaccesspolicy.xml,如我的问题所示。

              在主机路由中添加一个crossdomain.xml:

              <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
              <cross-domain-policy>
                <allow-http-request-headers-from domain="*" headers="*"/>
              </cross-domain-policy>
              

              确保绑定是 basicHttp,因为这是 silverlight 唯一支持的(当前)

              服务需要这个属性:

              [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
              

              有用的读物​​: http://weblogs.asp.net/tolgakoseoglu/archive/2008/03/18/silverlight-2-0-and-wcf.aspx

              http://timheuer.com/blog/archive/2008/06/06/changes-to-accessing-services-in-silverlight-2-beta-2.aspx

              http://silverlight.net/forums/t/19191.aspx

              http://timheuer.com/blog/archive/2008/04/09/silverlight-cannot-access-web-service.aspx

              【讨论】:

                【解决方案7】:

                我通过网络广播提供的一些调试技术试图展示我所写的一些技术:https://www.livemeeting.com/cc/mseventsbmo/view?id=1032386656&role=attend&pw=F3D2F263

                【讨论】:

                  【解决方案8】:

                  还有一些调试技巧listed here..还有useful post..

                  【讨论】:

                    【解决方案9】:

                    如果您在提供 Silverlight 应用程序的同一位置使用 WCF 服务,则不需要跨域策略。从多个实体之间存在关系的客户端返回 LINQ to SQL 数据时,我遇到了类似的错误。

                    首先确保您的 WCF 服务工作正常。通过创建一个简单的 ping 函数来回显其输入来做到这一点。确保你可以先调用它。如果这有效并且您的其他函数不起作用,无论是参数还是函数的返回。如果第一个功能也失败,请使用 Fiddler 之类的工具查看通过线路发送的数据。用一个 。在主机的末尾查看来自 localhost 的数据。所以像 http//localhost:1234./default.aspx 之类的东西,并为 WCF 地址使用相同的内容。

                    【讨论】:

                      【解决方案10】:

                      首先我会通过使用 Fiddler、FireBug 或类似工具检查网络调用来确保 Silverlight 确实找到了您的客户端访问策略文件。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-03-20
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-10-15
                        相关资源
                        最近更新 更多