【问题标题】:Pending Requests When Posting Data to ASP.NET web API Controller from ASP.NET MVC Controller从 ASP.NET MVC 控制器向 ASP.NET Web API 控制器发布数据时的待处理请求
【发布时间】:2023-03-28 21:10:01
【问题描述】:

我正在使用 ASP.NET MVC 和 ASP.NET WEB API 处理 SOA 项目。这两个项目都在不同的解决方案中,所以我们有一个 mvc 站点和一个 web api 站点,mvc 站点使用 http 方法操作调用 web api 站点。

考虑到这种情况,当我从我的 mvc 控制器向 Web API 发布一些数据时,我面临着一个奇怪的行为。当我进行 GET 操作时,一切正常。这就是我正在做的事情:

在我的 cshtml 视图中,我有一个对我的 MVC 控制器进行 ajax 调用的 js 代码:

> Create.cshtml 中的 JS 代码:

var create = (function () {
var _init = function (container, starter, url) {
    $(starter).autocomplete({
        minLength: 3,
        focus: function () {
            return false;
        },
        select: function (event, ui) {
            var terms = this.value.replace(" ", "").split(',');

            terms.pop();

            terms.push(ui.item.label);

            terms.push("");

            this.value = terms.join(",");
            return false;
        },
        search: function (event, ui) {
            if (_extractLast(this.value).length < 3)
                return false;

            return true;
        },
        source: function (request, response) {
            _execute(request, response, url);
        }
    });
};
var _extractLast = function (term) {
    var termArray = term.split(',');
    var lastTerm = termArray[termArray.length - 1];
    return lastTerm.replace(' ', '');
};
var _execute = function (request, response, url) {
    var responseCallback = response;
    $.ajax({
        url: '\Comunication\Contacts',
        async: true,
        type: 'POST',
        dataType: 'json',
        data: { termo: _extractLast(request.term) },
        success: function (data) {
            responseCallback($.map(data, function (item) {
                return { label: item.Name, value: item.Id }
            }));
        }
    });
}
return { init: _init };})();

从我的控制器内部,我从专门的服务层调用一个方法,向我的 WEB API 站点发出 POST 请求,执行 SOA,如下所示:

> MVC 控制器代码:

public class ComunicationController : BaseController{
     [HttpPost]
     public async Task<JsonResult> Contacts(string termo)
     {
         var contacts = new ContactServices.ConsumeAsync(new ContactParameter{Term: termo});
         return Json(contacts, JsonRequestBehavior.AllowGet);
     }
 }

> 层服务代码:

public class ContactServices{
public async Task<List<ContactsDTO>> ConsumeAsync(ContactParameter parameter)
{
    using (System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient())
    {
        httpClient.BaseAddress = new Uri("http://localhost:123456/api/comunication/contacts");
        httpClient.DefaultRequestHeaders.Accept.Clear();
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        HttpResponseMessage response = await httpClient.PostAsJsonAsync(new Uri("http://localhost:123456/api/comunication/contacts"), parameter);
        return JsonConvert.DeserializeObjectAsync<ResponseProxy<List<ContactsDTO>>>(response.Content.ReadAsStringAsync().Result).Result.data;
    }
}

}

我的 WEB API SITE 接受请求,按预期处理请求,这里不用担心。但是,当我在 POST 操作下将 HttpResponseMessage 从我的 WEB API 控制器返回到 MVC 站点时,根据我的网络监视器,请求响应将永远处于挂起状态......

所以基本上我的请求被挂起,协议状态为待处理,我从未收到请求响应,这是一张图片: Pending Status from My Post Request 正如我所说,当我向我的 Web api 发出 GET 请求时,一切正常,但是当我发出 POST 请求时,就会发生这种情况......

【问题讨论】:

    标签: ajax asp.net-web-api asp.net-mvc-5 asp.net-ajax asp.net-web-api2


    【解决方案1】:

    你的问题出在这一行:

    return JsonConvert.DeserializeObjectAsync<ResponseProxy<List<ContactsDTO>>>(response.Content.ReadAsStringAsync().Result).Result.data;
    

    使用 Task 的 Result 属性会在 MVC 控制器上产生死锁。如果 API 是异步的,则始终await 任务。

    var content = await response.Content.ReadAsStringAsync();
    var deserialized = await JsonConvert.DeserializeObjectAsync<ResponseProxy<List<ContactsDTO>>>(content);
    return deserialized.data;
    

    要详细了解为什么不应该阻止异步方法,请查看这篇精彩的帖子:
    Don't Block on Async Code

    【讨论】:

    • 非常感谢,你让我很开心。我没有注意到那个细节。真的很有效,谢谢!
    猜你喜欢
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2011-07-24
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多