我目前正在嘗試向我正在開發的應用程式添加一個簡單的輔助更新功能,但在發出 HTTP GET 請求時遇到了 Github API 的障礙。
我對 HTTP 協議并沒有太多經驗,所以如果這背后的原因很明顯,我深表歉意——我無法從其他問題中找到任何合適的答案,所以我們來了。
每當我從我的程式向 github API 發送 GET 請求時,它總是回傳最新的發布版本,而不是 URL 中指定的版本。
我已經嘗試了許多不同的 URL,所有這些都會導致下載相同的令人沮喪的諷刺版本4.0.4 (最新的完整版本):

| 版本 | 目標網址 |
|---|---|
3.3.2 |
https://api.github.com/repos/radj307/volume-control/releases/assets/57436695| |
5.0.0-pr4.4 |
https://api.github.com/repos/radj307/volume-control/releases/assets/65951248| |
5.0.0-pr4.4 |
https://github.com/radj307/volume-control/releases/download/5.0.0-pr4.4/VolumeControl.exe |
這是我用來發送請求的代碼:
using HttpClient client = new();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new("application/octet-stream"));
client.DefaultRequestHeaders.Add("User-Agent", "curl/7.64.1");
if (HttpDownloadFileAsync(client,
"https://api.github.com/repos/radj307/volume-control/releases/assets/65951248",
"VolumeControl.exe" //< replaced with hardcoded filename
).Wait(-1)) //< using infinite timeout in debug
{
// omitted for brevity
}
else
{
// omitted for brevity
}
client.Dispose();
這是HttpDownloadFileAsync我從這個答案中得到的功能:
static async Task HttpDownloadFileAsync(HttpClient httpClient, string url, string fileToWriteTo)
{
using HttpResponseMessage response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
using Stream streamToReadFrom = await response.Content.ReadAsStreamAsync();
using Stream streamToWriteTo = File.Open(fileToWriteTo, FileMode.Create);
await streamToReadFrom.CopyToAsync(streamToWriteTo);
}
總結一下:
我正在嘗試使用 .NET Core 6 從 github 的 API 下載特定的預發布版本HttpClient,無論我使用什么 URL,它總是回傳相同的(不正確的)版本。
我已經檢查了除錯器和 firefox 以查看 URL 是否正確,并且它是正確的 - API 似乎決定發回最新版本,無論我是否想要它。
為什么會發生這種情況,我可以做些什么不同的事情來獲得正確的版本?
uj5u.com熱心網友回復:
我決定繼續嵌入可執行檔案,因為我無法讓它作業,并且以某種方式修復了它。
直接通過 Visual Studio 的除錯器運行程式時它被破壞了,現在它在除錯器之外被呼叫,它可以正常作業而無需任何更改。
因此,我責怪MS。
uj5u.com熱心網友回復:
在我看來,您正在嘗試直接下載 API 資料,并將其保存為 .exe 檔案。您傳遞給 HttpDownloadFileAsync 的 URL 回傳 JSON 資料,而不是 .exe
如果您訪問您在瀏覽器中指定的 URL,您將看到該 API 的 JSON 輸出,其中有一個元素指定該可執行檔案的實際下載鏈接。
https://api.github.com/repos/radj307/volume-control/releases/assets/65951248:
{
"url": "https://api.github.com/repos/radj307/volume-control/releases/assets/65951248",
"id": 65951248,
.. other data ..
"browser_download_url": "https://github.com/radj307/volume-control/releases/download/5.0.0-pr4.4/VolumeControl.exe"
}
請注意,在底部,此結果會為您提供“browser_download_url”。您可以將 HttpDownloadFileAsync 中的 url 替換為給定的 URL,或者如果您需要從該 URL 檢索它,無論出于何種原因,您必須首先下載該 JSON 內容并檢索該 browser_download_url 值,并將其傳遞給 HttpDownloadFileAsync。
我希望這對您的問題有所幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/480716.html
標籤:C# http 得到 dotnet-httpclient http-get
