我不确定我的代码中有多少与找出问题相关,所以我将从头开始。我使用 Injection 创建一个 azure web job 程序,它看起来像这样:
static void Main()
{
try
{
//CompositionRoot code omitted - however, this part works.
CompositionRoot().Resolve<Application>().Run();
}
catch (Exception ex)
{
//some logging
}
}
然后我的应用程序运行方法如下所示:
public void Run()
{
var result = _someService.SomeMethod(new SomeParam()).GetAwaiter().GetResult();
}
然后服务调用第三方 api 并按如下方式进行调用:
public async Task<int> SomeMethod(SomeModel model)
{
var kvp = new List<KeyValuePair<string, string>> {
new KeyValuePair<string, string>("api_key", "api_key"),
}
var result = await FormPostStreamAsync(kvp, "some uri", null, CancellationToken.None);
var json = result.Content.ReadAsStringAsync().Result;
}
public async Task<HttpResponseMessage> FormPostStreamAsync(IList<KeyValuePair<string, string>> content, string uri, IList<KeyValuePair<string, string>> headers, CancellationToken cancellationToken)
{
if (cancellationToken.IsCancellationRequested) return null;
if (headers == null) headers = new List<KeyValuePair<string, string>>();
using (var client = new HttpClient())
using (var request = new HttpRequestMessage(HttpMethod.Post, uri))
using (var httpContent = CreateKvpHttpContent(content))
{
client.Timeout = TimeSpan.FromMinutes(30);
foreach (var header in headers)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
request.Content = httpContent;
return await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
}
}
当我调用上面的代码时:var json = result.Content.ReadAsStringAsync().Result;
我得到一个异常:
请求被中止:请求被取消。
我不知道为什么。我没有在任何地方调用取消,它也没有超时,因为这会立即发生,我设置了 30 分钟的超时时间,只是为了看看它是否有所作为。结果对象有值,它有标题和状态码 200。所以看起来 post 请求已经工作了,但是当它试图解析响应时,它抛出了那个异常。有谁知道我哪里出错了?
如果我通过提琴手查看响应,我会看到以下内容:
{"result_code":0,"result_message":"一些消息","result_output":"json"}
编辑:经过更多测试,我发现如果我从网站调用相同的代码(相同的参数)(不做任何更改),那么它就可以工作。但是,如果我从上面显示的应用程序中调用它,那么它不会。