{"record":{"id":"91adf205dd1fdc32","repo":"ThreeMammals/Ocelot","slug":"uploadfiletogithubrelease-statuscode-is","errorCode":null,"errorMessage":"UploadFileToGitHubRelease: StatusCode is ","messagePattern":"UploadFileToGitHubRelease: StatusCode is ","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"build.cake","lineNumber":1048,"sourceCode":"\tvar data = _File_.ReadAllBytes(file.FullPath);\r\n\tvar content = new System.Net.Http.ByteArrayContent(data);\r\n\tcontent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(\"application/octet-stream\");\r\n\r\n\tusing (var client = new System.Net.Http.HttpClient())\r\n\t{\t\r\n\t\tSetupGitHubClient(client);\r\n\t\tint releaseId = release.id;\r\n\t\tvar fileName = file.GetFilename();\r\n\t\tstring uploadUrl = release.upload_url.ToString();\r\n\t\t// Information($\"UploadFileToGitHubRelease: uploadUrl is {uploadUrl}\");\r\n\t\tstring[] parts = uploadUrl.Replace(\"{\", \"\").Split(',');\r\n\t\tuploadUrl = parts[0] + \"=\" + fileName; // $\"https://uploads.github.com/repos/ThreeMammals/Ocelot/releases/{releaseId}/assets?name={fileName}\"\r\n\t\tInformation($\"UploadFileToGitHubRelease: uploadUrl is {uploadUrl}\");\r\n\t\tvar result = client.PostAsync(uploadUrl, content).Result;\r\n\t\tif (result.StatusCode != System.Net.HttpStatusCode.Created) \r\n\t\t{\r\n\t\t\tInformation($\"UploadFileToGitHubRelease: StatusCode is {result.StatusCode}. Release ID is {releaseId}. Failed to upload file '{fileName}' to URL: {uploadUrl}\");\r\n\t\t\tthrow new Exception(\"UploadFileToGitHubRelease: StatusCode is \" + result.StatusCode);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nprivate void CompleteGitHubRelease(dynamic release)\r\n{\r\n\tint releaseId = release.id;\r\n\tstring url = release.url.ToString();\r\n\tstring body = ReleaseNotesAsJson();\r\n\tbool isPreRelease = !IsMainBranch();\r\n\tvar json = $\"{{ \\\"tag_name\\\": \\\"{versioning.NuGetVersion}\\\", \\\"target_commitish\\\": \\\"{versioning.BranchName}\\\", \\\"name\\\": \\\"{versioning.NuGetVersion}\\\", \\\"body\\\": \\\"{body}\\\", \\\"draft\\\": false, \\\"prerelease\\\": {isPreRelease.ToString().ToLower()} }}\";\r\n\tvar request = new System.Net.Http.HttpRequestMessage(new System.Net.Http.HttpMethod(\"Patch\"), url); // $\"https://api.github.com/repos/ThreeMammals/Ocelot/releases/{releaseId}\");\r\n\trequest.Content = new System.Net.Http.StringContent(json, System.Text.Encoding.UTF8, \"application/json\");\r\n\r\n\tusing (var client = new System.Net.Http.HttpClient())\r\n\t{\t\r\n\t\tSetupGitHubClient(client);\r\n\t\tvar result = client.SendAsync(request).Result;\r","sourceCodeStart":1030,"sourceCodeEnd":1066,"githubUrl":"https://github.com/ThreeMammals/Ocelot/blob/d1f22d930430410bfd0233f5e9e4f92980cf7df0/build.cake#L1030-L1066","documentation":"UploadFileToGitHubRelease uploads a release asset to the GitHub uploads URL and requires HTTP 201 Created. Non-201 statuses (401, 403, 404, 422) throw this error. The log line before the throw includes the release ID, file name, and full upload URL.","triggerScenarios":"Asset upload rejected: bad/insufficient token (401/403), wrong upload URL after parsing the release's upload_url (404), asset name already exists (422), or file too large (>2GB limit).","commonSituations":"Re-running a release where the asset was already uploaded; malformed uploadUrl templating (the '?name=' substitution); uploading packages artifacts that exceed GitHub limits; token scope regression in CI secrets.","solutions":["Check the logged uploadUrl and StatusCode; 404 usually means the release ID or URL template is wrong.","422: an asset with that name already exists — delete it or make the upload idempotent.","401/403: fix the token scope/secret used by SetupGitHubClient.","Verify the upload URL is built as {upload_url without {name,label}} + '?name={fileName}'.","Confirm the file exists and is under GitHub's 2GB asset limit."],"exampleFix":"// before\nuploadUrl = parts[0] + \"=\" + fileName;\n// after\nuploadUrl = parts[0] + \"?name=\" + Uri.EscapeDataString(fileName);","handlingStrategy":"retry","validationCode":"var assetExists = GetReleaseAssets(releaseId).Any(a => a.name == fileName);\nif (assetExists) { Warning($\"Asset {fileName} already uploaded; skipping.\"); return; }","typeGuard":null,"tryCatchPattern":"try { UploadFileToGitHubRelease(release, fileName, filePath); }\ncatch (Exception ex) when (ex.Message.Contains(\"StatusCode is \")) { Error($\"Asset upload failed: {ex.Message}\"); throw; }","preventionTips":["Make uploads idempotent — delete existing asset with the same name first","Verify the uploadUrl template derived from release.upload_url","Keep file sizes under GitHub's 2GB asset limit","Ensure token scope covers asset uploads"],"tags":["github-api","http","release-assets","upload"],"backgroundTag":"api-error-response","analyzedSha":"d1f22d930430410bfd0233f5e9e4f92980cf7df0","analyzedAt":"2026-09-12T13:50:06.067Z","contentChangedAt":"2026-09-12T13:50:06.067Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}