Чтение CSS содержимого файла с удаленного сервера с использованием c# web api - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь прочитать содержимое файла css с удаленного сервера, используя HTTPClient. Тем не менее, он дает содержимое мусора, а не фактическое содержимое файла. Может кто-нибудь помочь, пожалуйста, что отсутствует?

public async Task<IHttpActionResult> GetAttachment2()
        {
            UriBuilder uriBuilder = new UriBuilder();
            uriBuilder.Scheme = "https";
            uriBuilder.Host = "xyz.com";

            var Path = "jwt/resources/autogenerated/mystyle.css";
            uriBuilder.Path = Path;

                HttpClientHandler clientHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; } };
                using (HttpClient client = new HttpClient(clientHandler))
                {
                    client.BaseAddress = new Uri(uriBuilder.ToString());
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Authorization = Request?.Headers?.Authorization;
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/css"));
                    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
                    var content = await client.GetStringAsync(uriBuilder.Uri);
                }

            return Content(HttpStatusCode.OK, content);
        }

Вывод: � \ b "� \ b" � \ b "� \ b что-то вроде этого.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Я думаю, у вас есть две проблемы.

Во-первых, вам нужно изменить код, чтобы он действительно компилировался. У вас уже есть ответ, который имеет дело с этим, хотя вы можете просто вернуться изнутри блока using. Является ли это огромной разницей или нет, остается дискуссионным.

Но в любом случае код может выглядеть следующим образом:

using (HttpClient client = new HttpClient(clientHandler))
{
    client.BaseAddress = new Uri(uriBuilder.ToString());
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Authorization = Request?.Headers?.Authorization;
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/css"));
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
    var content = await client.GetStringAsync(uriBuilder.Uri);
    return Content(HttpStatusCode.OK, content);
}

Будьте осторожны, потому что вы действительно не должны используйте HTTPClient вот так , обернуть его внутри блока using неэффективно, вы хотите, чтобы один экземпляр клиента был доступен для всех ваших вызовов. Вместо этого сделайте вместо этого переменную stati c.

Ваша вторая проблема с символами мусора, которая может быть проблемой кодирования. Я бы проверил, какую кодировку вы используете, и, возможно, изменит способ настройки вашего клиента.

0 голосов
/ 06 февраля 2020

Вы объявили переменную содержимого content внутри оператора using. Попробуйте

    var Path = "jwt/resources/autogenerated/mystyle.css";
    uriBuilder.Path = Path;
    string content;

    HttpClientHandler clientHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; } };
    using (HttpClient client = new HttpClient(clientHandler))
    {
        client.BaseAddress = new Uri(uriBuilder.ToString());
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Authorization = Request?.Headers?.Authorization;
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/css"));
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
        content = await client.GetStringAsync(uriBuilder.Uri);
    }

    return Content(HttpStatusCode.OK, content);
...