Blazor WebAssembly C#调用DevOps REST API创建项目遇执行异常
问题
在Blazor WebAssembly的C#代码中调用REST API在DevOps创建新项目时,函数最后一行Microsoft.VisualStudio.Services.Operations.Operation operation = await operationsHttpClient.GetOperation(resultId);始终无法执行,且无任何错误抛出。已确认PAT和URI正确,相关代码如下:
public async Task PushProjectToDevOps(string pat, ProjectDTO project) { TeamProject teamProject = new(); teamProject.Name = project.Name; teamProject.Description = project.Description; VssBasicCredential credentials = new VssBasicCredential("", pat); var connection = new VssConnection(uri, credentials); OperationsHttpClient operationsHttpClient = connection.GetClient<OperationsHttpClient>(); using (ProjectHttpClient projectHttpClient = new ProjectHttpClient(uri, credentials)) { var resultId = projectHttpClient.QueueCreateProject(teamProject).Result.Id; Microsoft.VisualStudio.Services.Operations.Operation operation = await operationsHttpClient.GetOperation(resultId); } }
解决思路
- 禁止同步异步混用:代码中用
.Result同步调用QueueCreateProject,在Blazor WebAssembly单线程环境下会造成死锁,导致后续代码无法执行。改成异步调用:var createResult = await projectHttpClient.QueueCreateProject(teamProject); var resultId = createResult.Id; - 统一客户端实例化方式:
ProjectHttpClient单独实例化,和OperationsHttpClient的连接上下文不一致,建议通过VssConnection统一获取客户端:var projectHttpClient = connection.GetClient<ProjectHttpClient>(); // 去掉using,VssConnection会管理客户端生命周期 - 添加异常捕获与日志:隐藏的异常可能导致代码中断,添加捕获逻辑排查问题:
try { var createResult = await projectHttpClient.QueueCreateProject(teamProject); var resultId = createResult.Id; var operation = await operationsHttpClient.GetOperation(resultId); } catch (Exception ex) { Console.WriteLine($"异常信息:{ex.Message}"); if (ex is AggregateException aggEx) { foreach (var innerEx in aggEx.InnerExceptions) { Console.WriteLine($"内部异常:{innerEx.Message}"); } } throw; } - 校验操作ID有效性:在获取
resultId后打印日志,确认ID不为空或无效值,排除ID本身的问题。 - 检查跨域配置:Blazor WASM运行在浏览器中,需确认DevOps API已允许应用域名的跨域请求,查看浏览器控制台网络标签页是否有跨域错误。
内容的提问来源于stack exchange,提问作者Vischi
相关产品推荐
相关产品推荐

