Here is some error that most of Silverlight developers run into at some point.
An error occurred while trying to make a request to URI
'http://nave-pc/SilverGridWeb/GridDataService.asmx'.
This could be due to attempting to access a service in a cross-domain way
without a proper cross-domain policy in place, or a policy that is unsuitable
for SOAP services. You may need to contact the owner of the service to publish
a cross-domain policy file and to ensure it allows SOAP-related
HTTP headers to be sent. This error may also be caused by using internal types
in the web service proxy without using the InternalsVisibleToAttribute attribute.
Please see the inner exception for more details.
I had developed cross-domain access web services for Silverlight in the past and all
work like a charm. This morning I ran into this issue again while developing a new
web service for a new Silverlight application. I knew that I needed to add
CrossDomain.xml or ClientAccessPolicy.xml at root
of my web application. So I copied those files from existing application to this new one.
To my surprise it did not resolve the issue. I tried all kind of tricks and options
but nothing seemed to help. Finally I decided to look at Silverlight documentation and
see if there is anything new that has been done for Silverlight 3. Last time I did this
was for a Silverlight 2.0 application. I could not find anything different in the
description of what needed to be done. But then there was something in the sample
XML file content for these files that caught my eye and looked different that what I had.
<allow-from http-request-headers="SOAPAction" >
Notice the underlined section. Previously the value in the allowed headers used to be *.
Well, that does not seem to work any more. So I replaced it and everything worked fine.
There are some other important points I am going to discuss in this post. A lot of users
do not seem to be clear where these cross domain policy files should be placed.
Location of CrossDomain.xml and ClientAccessPolicy.xml
As the documentation states, these should be placed at the root of the application. Although
the statement is very clear but it causes lot of confusion about what is root? There are two
ways you create a site in IIS, Virtual Directory and Web Application.
So if you have a web site foo.com created as a web site in IIS, then the folder containing the
content of this site is root of the application. So your policy files go in that folder. If you have
created a virtual directory Bar under this web site where your web service is hosted,
then the root of the site is still foo.com and not foo.com/bar. To
verify it, open IIS log of your application and look for entries for Crossdomain.xml and
ClientAccessPolicy.xml. From those entries you can figure out where those files
should be located. If the caller is not finding those files, then you should 404
errors in your log file. For example here are entries from my log file.
1.17.30.170 GET /clientaccesspolicy.xml - 80 - 1.17.30.162 404 0 2 1
1.17.30.170 GET /crossdomain.xml - 80 - 1.17.30.162 404 0 2 1
This is very important. If you are hosting your web service in a web application that is created as a
virtual directory in Default Web Site then you need to copy these files in
wwwroot folder or whatver folder is configured to be default folder for your
IIS installation. Copying policy files in your virtual directory is not going to help. You
can also verify the location by looking at traffic in fiddler for your web service access.
Content for CrossDomain.xml and ClientAccessPolicy.xml
I have copied the content of these two files below. These files work for me on my my servers for
cross domain access from silverlight.
ClientAccessPolicy.xml
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction ">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
CrossDomain.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="SOAPAction,Content-Type"/>
</cross-domain-policy>