मैं ASP.NET Core 3 पर आधारित सरल वेब एपीआई लिखने की कोशिश करता हूं। लेकिन मुझे CORS नीति में समस्या है। वह मेरा स्टार्टअप वर्ग है:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddCors();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseCors(
            options => options.WithOrigins("http://myorigin.com").AllowAnyMethod().AllowAnyHeader()
        );

        app.UseForwardedHeaders(new ForwardedHeadersOptions
        {
            ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
        });

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

इस तरह मैं इसे फ्रंट-एंड से कॉल करता हूं:

function api_call()
    {
        var form = document.forms["userForm"];
        $.ajax({
            type: "GET",
            url: "http://myorigin.com:8080/access",
            contentType: "application/json",
            crossDomain:true,
            success: function (worker) {
                form.elements["result"].value = worker;
            },
            error: function (jxqr, error, status) {
                console.log(jxqr);
                if(jxqr.responseText===""){
                    form.elements["result"].value = jxqr.statusText;
                }
                else{
                    var response = JSON.parse(jxqr.responseText);
                    console.log(response);
                    if (response['Auth']) {
                        $.each(response['Auth'], function (index, item) {
                            form.elements["result"].value = item;
                        });
                    }
                }
            },
        });
    }

लेकिन इस फ़ंक्शन को एपीआई तक पहुंच नहीं मिलती है। यह संदेश देता है कि अनुरोध CORS नीति द्वारा अवरुद्ध किया गया था:

प्रीफ्लाइट अनुरोध का जवाब एक्सेस कंट्रोल चेक पास नहीं करता है: अनुरोधित संसाधन पर 'पहुंच-नियंत्रण-अनुमति-उत्पत्ति' शीर्षलेख मौजूद नहीं है।

मैंने अलग-अलग लेखों में CORS को अलग-अलग तरीकों से इस्तेमाल करने की कोशिश की। मैंने मैन्युअल CORS मिडलवेयर जोड़ने की भी कोशिश की लेकिन परिणाम वही रहा। माई वेब एपी उबंटू पर होस्ट किया गया है और बिना गलतियों के केस्ट्रल सेवा द्वारा चलाया जाता है। साथ ही जब मैं इसे विजुअल स्टूडियो में स्थानीय रूप से चलाता हूं और अपने जेएस फ़ंक्शन पथ में लोकलहोस्ट (url: "http://localhost पर लिखता हूं: 56597/एक्सेस") यह एपीआई को कॉल करता है और इससे सफलतापूर्वक प्रतिक्रिया प्राप्त करता है।

मेरी गलती क्या है? मेरा फ्रंट-एंड और वेब एपीआई एक ही होस्ट पर स्थित हैं लेकिन विभिन्न बंदरगाहों को सुनते हैं।

0
Ярослав Оверченко 17 पद 2019, 16:19

1 उत्तर

सबसे बढ़िया उत्तर

मैंने अपनी गलतियों की स्थापना की। मैं इसे अपनी कॉन्फ़िगर विधि में जोड़ना भूल गया:

app.UseAuthentication();

मैंने एक लेख में पढ़ा कि मेरे मामले में इसकी आवश्यकता है। वेब एपी के लिए मेरी अपाचे कॉन्फ़िगरेशन में भी गलतियां थीं। मेरे पास इस तरह के पैरामीटर थे:

ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/

लेकिन उन्हें ऐसा होना चाहिए:

ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/

अब मेरी वेब एपीआई काम कर रही है और सीओआरएस के साथ कोई समस्या नहीं है।

0
Ярослав Оверченко 18 पद 2019, 06:34