我正在尝试进行webservice异步,所以你可以回复并且websevice调用是在后台完成的,但是因为我对异步的东西很不敏感,所以我需要一些帮助。 这是我的代码:
在我的行动结果中,我已经调用了包含asyinc内容的方法
public ActionResult SavePackage(string ParcelNumber)
{
/////some other stuff
SaveAsync(ParcelNumber);
}
And
然后我有异步方法:
public async Task SaveAsync(string ParcelNumber)
{
await api.RegisterPackage(ParcelNumber);
}
哪个叫api:
public async Task RegisterPackage(string ParcelNumber)
{
var rk = "some api http";
HttpWebRequest request = WebRequest.Create(rk) as HttpWebRequest;
request.Headers.Add("cache-control", "no-cache");
request.Method = "POST";
request.ContentType = "application/json";
string data = "{\n \"ParcelNumber\": \"" + ParcelNumber+ "\"}";
byte[] dataStream = Encoding.UTF8.GetBytes(data);
Stream newStream = request.GetRequestStream();
// Send the data.
newStream.Write(dataStream, 0, dataStream.Length);
newStream.Close();
Task<WebResponse> getResponseTask = Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null);
await getResponseTask.ContinueWith(getResponseAntecedent =>
{
WebResponse webResponse = getResponseAntecedent.Result;
using (var reader = new StreamReader(webResponse.GetResponseStream()))
{
string error = reader.ReadToEnd();
//TODO: use JSON.net to parse this string and look at the error message
var myDeserializedObjList3 = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObjectAtt>(error);
var isValid = myDeserializedObjList3.IsValid;
var ModelErrors = myDeserializedObjList3.ModelErrors;
var ValidationErrors = myDeserializedObjList3.ValidationErrors;
}
});
}
我的问题是上面的代码仍在等待响应完成(这可能需要大约20秒),我想如果可能的话,当我打电话给api我可以回到我的ui并让人们做他们的api是在后台处理的。
有人有任何建议吗?
答案 0 :(得分:0)
正如我在博客中描述的那样,async
does not change the HTTP protocol。
首先,解决问题的最佳解决方案是根本不更改ASP.NET操作方法。相反,让实际的 UI 应用程序异步发出调用。如果您的UI应用是.NET应用,那么它可以使用async
/ await
;如果它是一个Web应用程序(即JavaScript),那么它可以使用AJAX调用。另一个好的选择是引入SignalR,它允许服务器在工作完成时发出信号。
如果确实想要在请求之外运行ASP.NET代码(从不推荐),那么您可以使用我在博客上描述的ASP.NET fire-and-forget技术之一