using System;
using System.IO;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Web;
using System.Text;

public static class ClientCrossDomainAccessPolicy
{
    [ServiceContract]
    public interface IPolicy
    {
        //确定可以访问“http://localhost:80/clientaccesspolicy.xml"
        [OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
        Stream GetSilverlightPolicy();

        //确定可以访问“http://localhost:80/crossdomain.xml"
        [OperationContract, WebGet(UriTemplate = "/crossdomain.xml")]
        Stream GetFlashPolicy();
    }

    class Policy : IPolicy
    {
        #region IClientAccessPolicy Members

        Stream StringToStream(string result)
        {
            var oc = WebOperationContext.Current;
            if (oc == null)
                throw new NullReferenceException("WebOperationContext");

            oc.OutgoingResponse.ContentType = "application/xml";
            return new MemoryStream(Encoding.UTF8.GetBytes(result));
        }
        public Stream GetSilverlightPolicy()
        {
            const string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
<access-policy>
    <cross-domain-access>
        <policy>
            <allow-from http-request-headers=""*"">
                <domain uri=""*""/>
            </allow-from>
            <grant-to>
                <socket-resource port=""4502-4534"" protocol=""tcp"" />
            </grant-to>
        </policy>
    </cross-domain-access>
</access-policy>";
            return StringToStream(result);
        }

        public Stream GetFlashPolicy()
        {
            const string result = @"<?xml version=""1.0""?>
<!DOCTYPE cross-domain-policy SYSTEM ""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"">
<cross-domain-policy>
    <allow-access-from domain=""*"" />
</cross-domain-policy>";
            return StringToStream(result);
        }

        #endregion
    }

    public static ServiceHost GetHost(string hostname)
    {
        var policyHost = new ServiceHost(typeof(Policy), new Uri("http://"+hostname + ":80"));//端口必须为80。若非TCP,像如HTTP托管,则直接将Policy发布至根下即可
        policyHost.AddServiceEndpoint(typeof(IPolicy), new WebHttpBinding(), string.Empty).Behaviors.Add(new WebHttpBehavior());

        return policyHost;
    }
}