从Silverlight调用WCF服务

时间:2020-03-06 14:36:34  来源:igfitidea点击:

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

iv创建了一个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>
An error occurred while trying to make
  a request to URI
  'http://localhost:8005/Service1.svc'.
  This could be due to a cross domain
  configuration error. Please see the
  inner exception for more details. --->
  
  {System.Security.SecurityException
  ---> System.Security.SecurityException:
  Security error.    at
  MS.Internal.InternalWebRequest.Send() 
  at
  System.Net.BrowserHttpWebRequest.BeginGetResponseImplementation()
  at
  System.Net.BrowserHttpWebRequest.InternalBeginGetResponse(AsyncCallback
  callback, Object state)    at
  System.Net.AsyncHelper.<>c__DisplayClass4.b__3(Object sendState)    --- End of inner
  exception stack trace ---    at
  System.Net.AsyncHelper.BeginOnUI(BeginMethod
  beginMethod, AsyncCallback callback,
  Object state)    at
  System.Net.BrowserHttpWebRequest.BeginGetResponse(AsyncCallback
  callback, Object state)    at
  System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteSend(IAsyncResult
  result)    at
  System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnSend(IAsyncResult
  result)}

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

解决方案

首先,请确保Silverlight通过使用Fiddler,FireBug或者类似工具检查网络调用来真正找到客户端访问策略文件。

这里列出了一些调试技术。一个更有用的文章。

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

首先,请确保WCF服务正常运行。为此,可以创建一个简单的ping函数来回显其输入。确保我们可以先拨打此电话。如果此方法有效,而其他函数没有用参数或者函数的返回值执行任何操作。如果第一个功能也失败,请使用Fiddler之类的工具查看通过网络发送的数据。用一个 。在主机末尾查看来自本地主机的数据。所以类似http // localhost:1234./default.aspx的WCF地址。

我通过网络广播获得了一些调试技术,试图证明我写的一些技术:https://www.livemeeting.com/cc/mseventsbmo/view?id=1032386656&role=attend&pw=F3D2F263

我知道该服务可以正常运行,因为我将其添加为对基本网站的引用,并且可以正常运行。我将尝试使用Fiddler,尽管存在一个小问题,因为xaml控件没有使用内置的testpage渲染器嵌入到网页中。

这是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

我有同样的问题。我确实看到silverlight客户端应用程序成功获取了clientaccesspolicy.xml。我确实通过直接通过Firefox请求来确保clientaccesspolicy.xml的格式正确。该政策与上述政策一样是开放的。

现在,出现了怪异的转折。如果我删除了clientaccesspolicy.xml,而是添加了Flash样式crossdomain.xml策略文件,那么它将起作用。通过检查网络,我确实看到如何首先不成功地请求clientaccesspolicy.xml,然后Silverlight退回到crossdomain.xml。

因此,我确实有一个解决方法,但是我更喜欢使clientaccesspolicy.xml正常工作,这样就无需进行其他不必要的网络往返。

有什么建议?

我发现约翰·帕帕(John Papa)撰写的《 Silverlight 2的数据驱动服务》一书对此进行了广泛讨论。我遇到了同样的问题,这本出色的书解释了这一切。

不知道问题是否相同,但是我刚刚写了博客,讲述我这个周末试图让我的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"(任一种方式)

哦,当我们开始使用它时,我们可能希望使其更加安全:-)

祝你好运!

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