【问题标题】:Read CSS file contents from remote server using c# web api使用 c# web api 从远程服务器读取 CSS 文件内容
【发布时间】:2020-02-06 04:48:23
【问题描述】:

我正在尝试使用 HTTPClient 从远程服务器读取 css 文件内容。但是,它给出的是垃圾内容而不是实际的文件内容。有人可以帮忙看看缺少的东西吗?

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 类似这样。

【问题讨论】:

  • 该代码甚至无法编译

标签: c# asp.net-web-api httpclient


【解决方案1】:

您已经在 using 语句中声明了 content 内容变量。试试

    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);

【讨论】:

    【解决方案2】:

    我认为你有两个问题需要处理。

    首先,您需要更改代码以使其实际编译。尽管您可以简单地从 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 块中根本没有效率,你想让一个客户端实例可供所有人使用您拨打的电话。例如,将其改为静态变量。

    垃圾字符的第二个问题,可能是编码问题。我会检查您使用的编码类型,并可能相应地更改您设置客户端的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2019-07-27
      • 2021-05-27
      • 1970-01-01
      • 2014-12-25
      • 2021-06-27
      • 1970-01-01
      相关资源
      最近更新 更多