Прокси-вызов для удаленного JSON, чтобы избежать проблемы CORS - PullRequest
0 голосов
/ 17 мая 2018

Я разрабатываю угловое приложение, которое должно использовать данные json с удаленного сервера. Из-за проблемы CORS приложение не может напрямую получать данные с этого сервера. Мое решение состоит в том, чтобы разработать веб-API «прокси» для чтения и возврата этого json в мое приложение. В настоящее время я так делаю:

public async Task<IActionResult> MyJson()
{
    const string jsonUrl = "url-of-remote-json";
    using (var client = new HttpClient())
    {
        using (var result = await client.GetAsync(jsonUrl))
        {
            if (result.IsSuccessStatusCode)
            {
                return new ObjectResult(JsonConvert.DeserializeObject(await result.Content.ReadAsStringAsync()));
            }
        }
    }

    return new ObjectResult(new { });
}

Однако я считаю, что это далеко не считается эффективным способом, потому что мне нужно прочитать json как строку, а затем преобразовать ее в объект, используя пакет JsonConvert для подачи метода web api. Поэтому производительность не очень хорошая.

Интересно, есть ли более простой / эффективный / более простой способ выполнить эту задачу?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Это модифицированная версия кода @ Alex, использующего HttpClient вместо WebClient:

public async Task MyJson()//void if not async
{
    string jsonUrl = "url-to-json";
    HttpContext.Response.ContentType = "application/json";
    using (var client = new HttpClient())
    {
        try
        {
            byte[] bytes = await client.GetByteArrayAsync(jsonUrl);
            //write to response stream aka Response.Body
            await HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length);
        }
        catch (Exception e)//404 or anything
        {
            HttpContext.Response.StatusCode = 400;//BadRequest
        }
        await HttpContext.Response.Body.FlushAsync();
        HttpContext.Response.Body.Close();
    }
}

Это мой действительный код:

    public async Task<IActionResult> MyJson()
    {
        const string jsonUrl = "url-to-json";
        HttpContext.Response.ContentType = "application/json";
        using (var client = new HttpClient())
        {
            try
            {
                byte[] bytes = await client.GetByteArrayAsync(jsonUrl);
                //write to response stream aka Response.Body
                await HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length);
                await HttpContext.Response.Body.FlushAsync();
                HttpContext.Response.Body.Close();
            }
            catch (Exception e)
            {
                return new BadRequestResult();
            }
        }

        return new BadRequestResult();
    }
0 голосов
/ 18 мая 2018

Просто передайте ответ от удаленного сервера. Посмотрите на отредактированный пример.

public async Task MyJson()//void if not async
{
    string jsonUrl = "url-to-json";
    HttpContext.Response.ContentType = "application/json";
    using (var client = new System.Net.WebClient())
    {
        try
        {
            byte[] bytes = await client.DownloadDataTaskAsync(jsonUrl);
            //write to response stream aka Response.Body
            await HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length);
        }
        catch (Exception e)//404 or anything
        {
            HttpContext.Response.StatusCode = 400;//BadRequest
        }
        await HttpContext.Response.Body.FlushAsync();
        HttpContext.Response.Body.Close();
    }
}

Работает как положено.

...