MVC Azure + AjaxCall + microsofttranslator + Ответ на предполётный запрос не проходит проверку контроля доступа: у него нет статуса HTTP ok - PullRequest
0 голосов
/ 12 апреля 2019
    public async Task<string> accountLockUnlock(string wordtobeConverted)
    {
        try
        {
            var translatedText = "";
            while (true)
            {
                translatedText = await Translate(wordtobeConverted, "en");
                return translatedText;
            }
        }
        catch (Exception ex)
        {
            //CreateConsentsResponse consents = new CreateConsentsResponse();
            //consents.id = ex.Message.ToString();
            //return consents;
            throw new Exception(ex.Message.ToString());
        }
    }

    public static async Task<string> Translate(string text, string language)
    {
        var encodedText = WebUtility.UrlEncode(text);
        var uri = "https://api.microsofttranslator.com/V2/Http.svc/Translate?" +
            $"to={language}&text={encodedText}";
        var result = await client.GetStringAsync(uri);
        return XElement.Parse(result).Value;
    }
    private const string key = "Key";
    private static readonly HttpClient client = new HttpClient
    {
        DefaultRequestHeaders = { { "Ocp-Apim-Subscription-Key", key } }
    };

После хостинга, если попытаться позвонить из PostMan, я получаю правильный пример вызова: azurewebsites.net/.../Ciao Результат, который мы получаем как «ПРИВЕТ», так что никаких проблем до сих пор

Если я пытаюсь позвонить по тому же URL-адресу azurewebsites.net/.../Ciao от вызова Ajax, получаю сообщение «Ответ на предпечатный запрос не проходит проверку контроля доступа: у него нет статуса HTTP ok»

MyAjax Call:

var settings = {"async": true, "crossDomain": true, "url": "azurewebsites.net/.../Ciao", "method": "GET", "headers ": {" cache-control ":" no-cache "," Access-Control-Allow-Headers ":" * "}} $. ajax (settings) .done (function (response) {console.log (response));});

Может ли кто-нибудь помочь мне здесь?

1 Ответ

0 голосов
/ 28 апреля 2019

Причина вышесказанного относится к CORS (Cross Source Resource Sharing)

Есть несколько советов и приемов, доступных на множественных сайтах для CORS. Проверьте эти здесь

Есть несколько способов решения проблемы, давайте пройдемся по шагам.

1: Добавление следующих customHeaders в web.config сервера Web API.

<httpprotocol>
    <customheaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" />
        <add name="Access-Control-Allow-Credentials" value="true" />
    </customheaders>
</httpprotocol>

После добавления указанных выше ключей попробуйте запустить клиентское приложение, проблема не будет решена. Ошибка может быть замечена в Средстве разработчика> вкладка Консоли Chrome.

Если используется Internet Explorer 10 или 11, то на вкладке консоли отображается следующая ошибка.

XMLHttpRequest: Network Error 0x2efd, Could not complete the operation due to error 00002efd.

2: Удалите заголовки из файла web.config, упомянутого выше.

3: Ищите CORS в Управлении пакетами Nuget в Visual Studio, я использую VS 2013. Убедитесь, что на левой панели выбрано «Онлайн», и вы можете увидеть поддержку перекрестного происхождения Microsoft ASP.NET Web API 2.2 и установить ее. если не установлен Если такой же пакет уже установлен в вашем веб-API, то справа от него будет видна правая отметка в зеленом округленном круге.

4: Вначале мы упоминали, что при внедрении членства в аккаунте возникает ошибка. Теперь, чтобы решить проблему, добавьте следующую инструкцию использования в AccountController. Атрибут может применяться на определенном уровне функции или для всех, как показано ниже:

[EnableCors(origins: "*", headers: "*", methods: "*")]

Приведенный выше атрибут в идеале должен располагаться чуть выше атрибута [Authorize].

5: Чтобы применить CORS ко всем контроллерам в Web API, в качестве первой строки в методе Register в WebApiConfig.cs можно указать следующее.

public static void Register(HttpConfiguration config)
{
config.EnableCors();
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
......

6: при реализации индивидуальной аутентификации с использованием базы данных членства шаблон в Visual Studio добавляет файл ApplicationOAuthProvider.cs. В этом файле есть один метод, который предоставляет учетные данные ресурса. Имя метода:

public override async Task GrantResourceOwnerCredentials
(OAuthGrantResourceOwnerCredentialsContext context)

В этом методе нужно проверить, добавлено ли что-нибудь подобное.

context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", 
new[] { "yourdomain:yourpostnumber" });

Если это так и клиент пытается войти в систему, то на вкладке Консоль появляется следующая ошибка

enter image description here

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:53005' is therefore not allowed access. The response had HTTP status code 500.

enter image description here

Это потому, что мы уже включили config.EnableCors (); в WebApiConfig.cs, а также попробуйте добавить context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "yourdomain:yourpostnumber" });

Так что обязательно удалите context.OwinContext.Response.Headers.Add строку из файла ApplicationOAuthProvider.cs и попробуйте. Ошибка не будет видна.

Также для дальнейшего ознакомления, пожалуйста, проверьте CORS ISSUE

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...