异步Task <string>的AJAX调用成功命中该方法,但返回失败

Rik*_*iki 4 c# ajax jquery async-await

我有一个MVC控制器(不是api控制器)[HttpPost]方法public async Task<string> PostDocument(),正在从客户端对其进行ajax调用。并且该方法正在另一个API调用的[HttpPost]方法PostDocument(DocRepoViewModel docRepo)。下面是我的代码:

public async Task<string> PostAdminUploadData()
{
    HttpResponseMessage response = null;
    //set the parameter docRepo (a complex object)
    try {
        using (var client = new HttpClient())
        {
            string uri = documentRepositoryApiUrl + Constants.PostDoc;
            client.BaseAddress = new Uri(documentRepositoryApiUrl);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            response = await client.PostAsJsonAsync(Constants.PostDoc, docRepo); //docRepo parameter for API method
        }
    }
    catch (Exception ex){}

    return (await response.Content.ReadAsAsync<string>());
}
Run Code Online (Sandbox Code Playgroud)

现在在上面的代码中,response = await client.PostAsJsonAsync(Constants.PostDoc, docRepo);代码段返回success到响应var(因为它做了我期望的工作),但是当上述方法响应时,响应始终陷error:在ajax中,而我的ajax却没有:

$.ajax({
    url: url,
    type: 'Post',
    data: data,
    cache: false,
    dataType: 'json',
    async: true,
    contentType: false,
    processData: false,
    success: function (data) {
        alert("pass");
    },
    error: function (data) {
        alert("field"); //always failed
    }
});
Run Code Online (Sandbox Code Playgroud)

C#的任何地方都不会抛出异常。请帮我解决问题

Hoe*_*cus 5

我遇到了类似的问题。首先,更改您的ajax请求,以便删除dataType并指定contentType:

// dataType: "json",
contentType: "application/json",
Run Code Online (Sandbox Code Playgroud)

然后,尝试将操作的返回类型更改为Task<ActionResult>,并使用Controller上的一种常用方法,例如:

return Json(/* valid json string content */) 
Run Code Online (Sandbox Code Playgroud)

要么

return Content(/* read content as a string here */)
Run Code Online (Sandbox Code Playgroud)

原因是WebApi控制器获得了一个序列化层,将结果转换为客户端请求的格式。相反,希望MVC控制器调用一种方法,该方法将某种操作结果(通常是视图或类似的结果)返回给视图引擎。

在尝试返回特定模型时,我在JavaScript端收到的只是该对象的Type的完全限定名称。

另一个选择可能是用[AcceptAjax]属性或类似内容装饰您的操作,我相信该属性可以使该操作回复ajax请求。