异步尝试不能正常工作

时间:2016-08-08 07:20:22

标签: asp.net-mvc asynchronous httpwebrequest httpwebresponse

我正在尝试进行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是在后台处理的。

有人有任何建议吗?

1 个答案:

答案 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技术之一