Saya menghosting sendiri layanan WCF yang perlu mendukung lalu lintas CORS REST masuk. Jadi saya menambahkan file Global.asax.cs dengan blok kode berikut, tetapi Application_BeginRequest() tidak pernah menyala. Saya juga telah mengatur di app.Config saya. Apakah ada hal lain yang perlu saya lakukan dan apakah ini berfungsi untuk layanan yang dihosting sendiri atau hanya layanan yang dihosting melalui IIS?

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        string origin = HttpContext.Current.Request.Headers["origin"];
        if (!String.IsNullOrEmpty(origin)) // CORS origin?
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", origin);

        if (HttpContext.Current.Request.HttpMethod == "OPTIONS") // CORS origin w/ options?
        {
            var requestedHeaders = HttpContext.Current.Request.Headers["Access-Control-Request-Headers"];
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", requestedHeaders);
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS,DELETE");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
            HttpContext.Current.Response.StatusCode = 200;
            HttpContext.Current.Response.End();
        }
    }
0
Wildview 30 Juni 2020, 19:15

1 menjawab

Jawaban Terbaik

Hanya file Global yang dihosting di IIS yang akan berlaku. IIS akan memperlakukan layanan WCF sebagai layanan web untuk mengurai file Globalnya. Jika di-host sendiri, file Global tidak akan diuraikan dan dijalankan.

Kami dapat membuat WCF mendukung JSONP untuk menyelesaikan lintas domain:

<binding name="bind1" crossDomainScriptAccessEnabled="true">
</binding>

Anda juga dapat menerapkan IDispatchMessageInspector untuk menambahkan header respons sebelum layanan merespons. Solusi ini cocok untuk hosting mandiri.

public class ServerMessageLogger : IDispatchMessageInspector
    {
        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
           return null;
        }

        public void BeforeSendReply(ref Message reply, object correlationState)
        {
            WebOperationContext ctx = WebOperationContext.Current;
            ctx.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");
        }
    }

Untuk informasi lebih lanjut tentang IDispatchMessageInspector, Silakan merujuk ke tautan berikut:

https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.dispatcher.idispatchmessageinspector?view=netframework-4.8

Jika masih kurang jelas, Anda bisa merujuk ke link di bawah ini yang berisi kode lengkapnya:

Bagaimana cara mengaktifkan Cross-Origin Resource Sharing di .Net Console Application WCF Service?

PERBARUI

Gambar berikut adalah demo saya:

enter image description here

enter image description here

Salah satu dari dua gambar di atas menggunakan WebOperationContext yang tidak digunakan.

Faktanya, WebOperationContext mirip dengan HttpContext. WebOperationContext biasanya digunakan dalam metode WCF REST, dan HttpContext biasanya digunakan di halaman ASP.NET WebForms atau metode Web ASMX Web Service.

2
Ding Peng 2 Juli 2020, 02:11