C# 调用workItemTrackingHttpClient.CreateWorkItemAsync()在部署到云上时会引发不同的异常
我正在尝试使用客户端库和OAuth作为身份验证机制在Azure DevOps中创建一个工作项 它在我的本地机器上运行良好(当我在本地调试它时),但在部署到云上时抛出异常(在我的例子中是Azure应用程序服务)C# 调用workItemTrackingHttpClient.CreateWorkItemAsync()在部署到云上时会引发不同的异常,c#,visual-studio,azure,azure-devops,azure-devops-rest-api,C#,Visual Studio,Azure,Azure Devops,Azure Devops Rest Api,我正在尝试使用客户端库和OAuth作为身份验证机制在Azure DevOps中创建一个工作项 它在我的本地机器上运行良好(当我在本地调试它时),但在部署到云上时抛出异常(在我的例子中是Azure应用程序服务) 在这里,我得到了这种例外情况,最后一行: d__52.MoveNext()---上一个位置的堆栈结束跟踪,其中 异常被抛出---在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)在 System.R
在这里,我得到了这种例外情况,最后一行: d__52.MoveNext()---上一个位置的堆栈结束跟踪,其中 异常被抛出---在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.d_u50.MoveNext() ---来自引发异常的上一个位置的堆栈结束跟踪---在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.d_47
1.MoveNext()
---来自引发异常的上一个位置的堆栈结束跟踪---在
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.d_u28
1.MoveNext()
---来自引发异常的上一个位置的堆栈结束跟踪---在
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务
(任务)
您必须在请求正文中传递有效的修补程序文档,在Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase上。
因为我使用的是OAuth机制,所以AccessToken只在我的云应用程序中生成。
因此,为了在本地运行它,我创建了一个单独的Asp.net web应用程序,并通过传递从我的云应用程序生成的访问令牌在本地运行它
当我在本地多次运行这两种方法时,这两种方法都运行得非常好,这一点我再强调也不为过。
我对此感到非常困扰,因为我对编程世界有点陌生,任何一点细节方面的帮助都将不胜感激。类似的问题如下: 这是稳定版本的一个Bug,所以您必须使用预览版本 尝试更新以预览客户端LIB的版本 编辑: 我真的不知道怎么做,但当我在Azure上部署我的上述代码时 云服务,它的工作。但当我运行时,它仍然显示异常 它位于Azure应用程序服务上。可能是我使用的Azure应用程序服务 在一个免费的计划下(没有任何核心),所以可能就是这样。 但是请注意,HttpClient在这两种情况下都起作用。希望 这个答案可以节省某人的时间 这段代码运行良好。这里不是使用WorkItemHttpClient,而是使用HttpClient
公共异步任务CreateWorkItemUsingHttpClient(string accesstoken)
{
尝试
{
HttpClient=新的HttpClient();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json补丁+json”);
client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,accesstoken);
WorkTempostData wiPostData=新的WorkTempostData();
wiPostData.op=“添加”;
wiPostData.path=“/fields/System.Title”;
wiPostData.value=“通过云创建的工作项”;
List WIPOSTDATARR=新列表{wiPostData};
字符串wiPostDataString=JsonConvert.SerializeObject(wiPostDataArr);
HttpContent-wiPostDataContent=newstringcontent(wiPostDataString,Encoding.UTF8,“应用程序/json补丁+json”);
字符串url=”https://dev.azure.com/xyz/abcproject/_apis/wit/workitems/$Bug?api版本=5.0“;
尝试
{
HttpResponseMessage response=client.PatchAsync(url,wiPostDataContent).Result;
尝试
{
if(响应。IsSuccessStatusCode)
{
response.EnsureSuccessStatusCode();
string responseContent=await response.Content.ReadAsStringAsync();
返回响应内容;
}
其他的
{
返回“成功代码返回false”;
}
}
捕获(例外情况除外)
{
返回“一”+ex.Message+“”+ex.StackTrace;
}
}
捕获(例外情况除外)
{
返回“两个”+ex.Message+“”+ex.StackTrace;
}
}
捕获(例外情况除外)
{
返回“三”+ex.Message+“”+ex.StackTrace;
}
}
此代码在本地和部署到云端时都能正常工作。
我不知道为什么WorkItemHttpClient不能在云上工作,并且即使在本地工作正常,也会出现与线程和补丁相关的异常。
我只是让外行猜测,也许WorkItemHttpClient不如HttpClient强大,因此在部署到云上时无法创建WorkItem,因为它必须更快地创建。但这只是一个非技术性的猜测
无论如何,我发布这个答案只是为了让其他可能面临同样问题的人可以参考这个解决方案,如果他们愿意的话。遵循文档中的步骤 只要一个变化 而不是
WorkItem result = workItemTrackingHttpClient.CreateWorkItemAsync(patchDocument, project, "Bug").Result;
新代码
WorkItem result = workItemTrackingHttpClient.CreateWorkItemAsync(patchDocument, project, "Issue").Result;
嗨,Shamrai,我想在你的情况下
public async Task<string> CreateWorkItemUsingHttpClient(string accesstoken)
{
try
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json-patch+json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accesstoken);
WorkItemPostData wiPostData = new WorkItemPostData();
wiPostData.op = "add";
wiPostData.path = "/fields/System.Title";
wiPostData.value = "Workitem created through cloud";
List<WorkItemPostData> wiPostDataArr = new List<WorkItemPostData> { wiPostData };
string wiPostDataString = JsonConvert.SerializeObject(wiPostDataArr);
HttpContent wiPostDataContent = new StringContent(wiPostDataString, Encoding.UTF8, "application/json-patch+json");
string url = "https://dev.azure.com/xyz/abcproject/_apis/wit/workitems/$Bug?api-version=5.0";
try
{
HttpResponseMessage response = client.PatchAsync(url, wiPostDataContent).Result;
try
{
if (response.IsSuccessStatusCode)
{
response.EnsureSuccessStatusCode();
string responseContent = await response.Content.ReadAsStringAsync();
return responseContent;
}
else
{
return "Success code returned false";
}
}
catch(Exception ex)
{
return "One " +ex.Message + " " + ex.StackTrace;
}
}
catch(Exception ex)
{
return "Two " +ex.Message + " " + ex.StackTrace;
}
}
catch(Exception ex)
{
return "Three " +ex.Message + " " + ex.StackTrace;
}
}
WorkItem result = workItemTrackingHttpClient.CreateWorkItemAsync(patchDocument, project, "Bug").Result;
WorkItem result = workItemTrackingHttpClient.CreateWorkItemAsync(patchDocument, project, "Issue").Result;