WCFクロスドメインHttpバインディング

14661 ワード

ドメイン別サービス:
特性WebGetはSystem.ServiceModel.Webにあります。


View Code
    [ServiceContract]

    public interface IDomainService

    {

        [OperationContract]

        [WebGet(UriTemplate = "ClientAccessPolicy.xml")]

        Message ProvidePolicyFile();

    }



    public class DomainService:IDomainService

    {

        #region IDomainService   



        public System.ServiceModel.Channels.Message ProvidePolicyFile()

        {



            /*

                                 ,        MemoryStream     ,      

                XmlReader reader = XmlReader.Create(@"ClientAccessPolicy.xml");

             */



             //FileStream filestream = File.Open(@"ClientAccessPolicy.xml", FileMode.Open,FileAccess.Read);

            //XmlReader reader = XmlReader.Create(filestream);   



            //ClientAccessPolicy.xml     exe    

             XmlReader reader = XmlReader.Create(@"ClientAccessPolicy.xml");

            System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);



           return result;

        }



        //CrossDomainServiceBehavior



        #endregion

    }
一般WCFサービス:


View Code
    [ServiceContract]

    public interface IWCFService

    {

        [OperationContract]

        int DoWork(int a, int b);



        [OperationContract]

        int DoWork2(int a, int b);

    }



    public class WCFService : IWCFService

    {

        public int DoWork(int a,int b)

        {

            return a + b;

        }



        public int DoWork2(int a, int b)

        {

            return a - b;

        }

    }
クロスドメインポリシーファイルclientaccesspolicy.xml:


View Code
<?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>
設定ファイルApp.com fig:


View Code
<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <system.serviceModel>

      <services>

        <service behaviorConfiguration="WCFBase.WCFServiceBehavior" name="WCFBase.WCFService">

          <endpoint address="" binding="basicHttpBinding" contract="WCFBase.IWCFService">

            <identity>

              <dns value="localhost" />

            </identity>

          </endpoint>

          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

          <host>

            <baseAddresses>

              <add baseAddress="http://localhost:9090/WCFService/" />

            </baseAddresses>

          </host>

        </service>

        <service name="WCFBase.DomainService">

          <endpoint address="" behaviorConfiguration="DomainServiceBehavior"

              binding="webHttpBinding" contract="WCFBase.IDomainService" />

          <host>

            <baseAddresses>

              <add baseAddress="http://localhost:9090/" />

            </baseAddresses>

          </host>

        </service>

      </services>

      

      <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

        <behaviors>

            <serviceBehaviors>

                <behavior name="WCFBase.WCFServiceBehavior">

                    <serviceMetadata httpGetEnabled="true" />

                    <serviceDebug includeExceptionDetailInFaults="false" />

                </behavior>

            </serviceBehaviors>

          <endpointBehaviors>

            <behavior name="DomainServiceBehavior">

              <webHttp/>

            </behavior>

          </endpointBehaviors>

        </behaviors>

      

      <!--

      <bindings>

        <basicHttpBinding>

          <binding name="NoneSecurity"

   maxBufferPoolSize="12000000" maxReceivedMessageSize="12000000" useDefaultWebProxy="false">

            <readerQuotas maxStringContentLength="12000000" maxArrayLength="12000000"/>

            <security mode="None"/>

          </binding>

        </basicHttpBinding>

      </bindings>

      -->

      

    </system.serviceModel>

 

</configuration>
起動方法


View Code
    class Program

    {

        static void Main(string[] args)

        {

            ServiceHost host = new ServiceHost(typeof(WCFService));

            host.Open();



            ServiceHost crossDomainserviceHost = new ServiceHost(typeof(DomainService));

            crossDomainserviceHost.Open();



            Console.WriteLine("Service Start...");

            Console.ReadKey();

            host.Close();

        }

    }