none
Silverlight General FAQ(Web Service): Bagaimana cara menyediakan file cross domain policy untuk layanan self-host WCF? RRS feed

  • Diskusi Umum

  • Meskipun mudah untuk memberikan file cross domain policy untuk IIS hosted web service, juga layanan self-host WCF, anda harus mengerjakan file tersebut dengan pemrograman.

    Bayangkan anda memiliki service hosting yang sederhana (actual service tidak penting):

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

    host.Open();

    Console.Read();

    host.Close();

     

    Base address menjadi:

    <add baseAddress="http://localhost:8731/Service1/" />

    Ketika anda mencoba untuk memanggil service dari aplikasi Silverlight, anda akan mendapatkan masalah cross domain karena anda tidak dapat host aplikasi Silverlight pada aplikasi konsol yang sama. Menempatkan file cross domain policy di direktori yang sama dengan exe konsol tidak akan membantu karena ini tidak dapat dibaca. Anda perlu membuat file tersebut dengan pemrograman.

    Kita bisa mulai dengan menciptakan WCF Service yang lain. Kita namakan itu CrossDomainService. Berikut adalah konfigurasinya:

    <system.serviceModel>

             <behaviors>

                       <serviceBehaviors>

                                <behavior name="ConsoleHostWcf.Service1Behavior">

                                         <serviceMetadata httpGetEnabled="true" />

                                         <serviceDebug includeExceptionDetailInFaults="false" />

                                </behavior>

                                <behavior name="ConsoleHostWcf.CrossDomainServiceBehavior">

                                         <serviceMetadata httpGetEnabled="true" />

                                         <serviceDebug includeExceptionDetailInFaults="false" />

                                </behavior>

                       </serviceBehaviors>

                       <endpointBehaviors>

                                <behavior name="webBehavior">

                                         <webHttp/>

                                </behavior>

                       </endpointBehaviors>

             </behaviors>

    <services>

                       <service behaviorConfiguration="ConsoleHostWcf.Service1Behavior"

                                                   name="ConsoleHostWcf.Service1">

    <endpoint address="" binding="basicHttpBinding" contract="ConsoleHostWcf.IService1">

                                         <identity>

                                                   <dns value="localhost" />

                                         </identity>

                                </endpoint>

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

                 <host>

                                         <baseAddresses>

                                                   <add baseAddress="http://localhost:8731/Service1/" />

                                         </baseAddresses>

                                </host>

                       </service>

                       <service behaviorConfiguration="ConsoleHostWcf.CrossDomainServiceBehavior"

                                                   name="ConsoleHostWcf.CrossDomainService">

                                <endpoint address="" binding="webHttpBinding" behaviorConfiguration="webBehavior"

                                            contract="ConsoleHostWcf.ICrossDomainService">

                                </endpoint>

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

                                <host>

                                         <baseAddresses>

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

                                         </baseAddresses>

                                </host>

                       </service>

             </services>

    </system.serviceModel>

     

    Catatan:

    Service yang baru harus menggunakan WebHttpBinding. Anda memerlukan reference System.ServiceModel.Web.dll.

    Anda memerlukan sebuah EndpointBehavior dimana anda bisa menerapkan webHttp.

    Base address untuk REST service diubah menjadi http://localhost:8731, karena file cross domain policy harus diambil dari alamat tersebut.

    Sekarang lanjutkan dengan service interface. Selain atribut OperationContract, anda akan membutuhkan UriTemplate. Di sini kita menentukan template untuk menjadi "clientaccesspolicy.xml". Dikombinasikan dengan base address yang ditentukan dalam konfigurasi di atas, anda akan bisa mendapatkan service dengan URI: http://localhost:8731/clientaccesspolicy.xml, dan itulah yang kita inginkan. Juga, perhatikan jika metode ini akan mengembalikan nilai string kita harus memadukannya dengan elemen xml ekstra. Ini adalah perilaku default DataContractSerializer. Untuk mengatasi itu, anda dapat mengembalikan  sebuah untyped Message.

    [OperationContract]

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

    Message GetPolicyFile();

    Berikut adalah cara untuk mengimplementasikan service. Pada dasarnya ini hanya berfungsi untuk membaca file tersebut dan mengembalikan isinya. Sebuah MessageBuffer dibutuhkan. Jika anda hanya mengembalikan pesan aslinya, sebuah exception akan dilempar karena FileStream dan XmlReader telah dibuang (karena kita menempatkan mereka dalam blok). Ini juga bukan ide yang baik untuk meninggalkan unmanaged resource secara terbuka, jadi harap diperhatikan supaya anda jangan hanya menghapus blok yang anda gunakan.

    public Message GetPolicyFile()

    {

             using (FileStream stream = File.Open("clientaccesspolicy.xml", FileMode.Open))

             {

                       using (XmlReader xmlReader = XmlReader.Create(stream))

                       {

                                Message m = Message.CreateMessage(MessageVersion.None, "", xmlReader);

                                using (MessageBuffer buffer = m.CreateBufferedCopy(1000))

                                {

                                         return buffer.CreateMessage();

                                }

                       }

             }

    }

     

    Akhirnya, kembali pada aplikasi Console dan buat layanan host lainnya:

    static void Main(string[] args)

    {

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

             ServiceHost host2 = new ServiceHost(typeof(CrossDomainService));

             host.Open();

             host2.Open();

             Console.Read();

             host.Close();

             host2.Close();

    }

    Untuk memverifikasi apakah service tersebut bekerja atau tidak, buka browser anda dan ketik http://localhost:8731/clientaccesspolicy.xml. Anda seharusnya dapat melihat isi dari file cross domain policy. Sekarang anda bisa memanggil service dari aplikasi Silverlight.


    Agnes Sannie [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Selasa, 29 Mei 2012 09.31
    Moderator