获取FedEx OAuth Token时的C#异步代码执行异常排查
FedEx OAuth Token 获取问题解决思路
一、「Misused header name, 'content-type'」错误修复
Postman生成的代码会错误地把Content-Type放到HttpRequestMessage.Headers里,这个头属于请求内容的专属头,不能放在通用请求头集合中,正确的做法是通过HttpContent对象设置:
- 若使用表单格式(FedEx OAuth通常要求
application/x-www-form-urlencoded):var requestContent = new FormUrlEncodedContent(new Dictionary<string, string> { { "grant_type", "client_credentials" }, { "client_id", "你的FedEx客户端ID" }, { "client_secret", "你的FedEx客户端密钥" } }); // FormUrlEncodedContent会自动设置Content-Type为application/x-www-form-urlencoded,无需手动添加 request.Content = requestContent; - 若使用JSON格式:
var jsonBody = "{\"grant_type\":\"client_credentials\",\"client_id\":\"xxx\",\"client_secret\":\"xxx\"}"; var requestContent = new StringContent(jsonBody, Encoding.UTF8, "application/json"); request.Content = requestContent;
二、异步调用时Result=Yet not computed问题解决
这种情况是同步阻塞异步代码引发的死锁,或者异步流程未正确执行,解决步骤如下:
- 全程异步调用:不要在同步方法里直接用
Result或Wait()阻塞异步方法,把调用方改成异步:static async Task Main(string[] args) { var oAuthResponse = await MakeApiCallAsync(); // 后续处理响应内容 } - 避免上下文死锁:如果必须在同步环境调用,在异步方法的
await后添加ConfigureAwait(false),避免捕获当前上下文:private static async Task<string> MakeApiCallAsync() { using var httpClient = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "https://apis.fedex.com/oauth/token"); // 按上面的方法设置request.Content... var response = await httpClient.SendAsync(request).ConfigureAwait(false); response.EnsureSuccessStatusCode(); // 主动抛出HTTP错误,方便排查 return await response.Content.ReadAsStringAsync().ConfigureAwait(false); } - 排查网络/接口问题:如果还是没走到
ReadAsStringAsync,检查是否网络不通、请求超时,或者FedEx接口返回了非2xx状态码。添加response.EnsureSuccessStatusCode()可以在HTTP错误时直接抛出异常,快速定位问题。
内容的提问来源于stack exchange,提问作者st_user_321122
相关产品推荐
相关产品推荐

