C# 取消令牌在Asp.Net Web Api 4.5中不起作用
我一直在尝试向我的web api异步控制器添加一个取消令牌,以便检测httpClient何时超时(这样我就可以停止任何挂起的等待调用),在这方面花费了数小时却没有成功。以下是我的桌面应用程序(.Net 4.0)调用web api:C# 取消令牌在Asp.Net Web Api 4.5中不起作用,c#,asp.net,C#,Asp.net,我一直在尝试向我的web api异步控制器添加一个取消令牌,以便检测httpClient何时超时(这样我就可以停止任何挂起的等待调用),在这方面花费了数小时却没有成功。以下是我的桌面应用程序(.Net 4.0)调用web api: public void GetServObjAsync() { try { var client = new HttpClient() { Timeout = TimeSpan.FromMillisecond
public void GetServObjAsync()
{
try
{
var client = new HttpClient()
{
Timeout = TimeSpan.FromMilliseconds(10000)
};
var myUri = new Uri("http://mysWebApi.net/myController");
client.GetAsync(myUri ).ContinueWith(t =>
{
if (t.IsCompleted)
{
t.Result.Content.ReadAsAsync<servObj>().ContinueWith(t2 =>
{
if (!t2.IsFaulted)
{
OnSerVObjReady(t2.Result);
}
}
}
}
}
catch
{
// Handle and notify
}
}
public void getServobJSync()
{
尝试
{
var client=新的HttpClient()
{
超时=时间跨度。从毫秒(10000)
};
var myUri=新Uri(“http://mysWebApi.net/myController");
client.GetAsync(myUri).ContinueWith(t=>
{
如果(t.已完成)
{
t、 Result.Content.ReadAsAsync().ContinueWith(t2=>
{
如果(!t2.IsFaulted)
{
OnSerVObjReady(t2.结果);
}
}
}
}
}
抓住
{
//处理并通知
}
}
这是我的web api控制器:
public class ServController : ApiController
{
public async Task<servObj> Get(CancellationToken Token)
{
try
{
await Task.Delay(15000);
var resp = await singleHttpCallAsync(Token);
if (Token.IsCancellationRequested)
{
return null;
}
var respObj = await multipleHttpCallsAsync(Token);
return respObj;
}
catch
{
return null;
}
}
private Async Task<servObj> multipleHttpCallsAsync(CancellationToken token)
{
var respObjs = new List<detailObj>();
var httpCalls = new Task<detailObj>[2];
httpCalls[0] = singleHttpCall2Async(0, token);
httpCalls[1] = singleHttpCall2Async(1, token);
await Task.WhenAll(httpCalls);
respObjs.Add(await httpCalls[0]);
respObjs.Add(await httpCalls[1]);
return new servObj(respObjs);
}
}
公共类ServController:ApicController
{
公共异步任务获取(CancellationToken令牌)
{
尝试
{
等待任务。延迟(15000);
var resp=await singleHttpCallAsync(令牌);
if(令牌.IsCancellationRequested)
{
返回null;
}
var respObj=等待多重HttpCallsAsync(令牌);
返回respObj;
}
抓住
{
返回null;
}
}
专用异步任务multipleHttpCallsAsync(CancellationToken令牌)
{
var respObjs=新列表();
var httpCalls=新任务[2];
httpCalls[0]=singleHttpCall2Async(0,令牌);
httpCalls[1]=singleHttpCall2Async(1,令牌);
等待任务WhenAll(httpCalls);
respObjs.Add(等待httpCalls[0]);
respObjs.Add(等待httpCalls[1]);
返回新的servObj(respObjs);
}
}
我曾尝试过在中所述的方法,其他许多方法都有不同的超时,但最后,请求完成并返回servObj(respObjs)。如果您能提供帮助,说明为什么httpClient.timeout没有反映在我的控制器中,我将不胜感激