函数在JavaScript调用时不返回数据

时间:2017-09-29 09:56:16

标签: javascript c#

在使用单元测试进行调试时,该函数会返回预期的数据,但是当从JavaScript调用相同的函数时,该函数会被命中但不会返回任何数据。

我在dll中调用的函数是挂起的,但只有当它被JS请求调用的函数调用时,为什么会这样?

编辑:

在评论中,我最好的猜测是它与正在使用的线程有关,但我不知道,因为函数本身正在工作,而不是从被调用的C#函数调用时AJAX。

AJAX电话:

function getOnHoldTickets() {
    $.ajax({
        type: "GET",
        url: "/cloud/getTicketCount/",
        dataType: "json",
        success: function (data) {
            onHoldHandler(data);
        },
        failure: function () {
            alert("getOnHoldTickets failled");
        }
    });
}

控制器:

// api gets hit from the JS call
[Route("cloud/getTicketCount")]
public List<UberTicket> getTicketCount()
{
    var tickets = Dashboard.getTODTickets("On Hold"); 
    return tickets;
}


[TestMethod] // calls the same method as JS
public void supportTicketTesting()
{
    var openTickets = Dashboard.getTODTickets("On Hold");
    var check = openTickets != null;
}

// method calling the dll
public static List<UberTicket> getTODTickets(string type)
{
    var tickets = UberAPI.getTODTickets(type);
    return tickets;
}

DLL方法:

// the method within the dll that's hanging when called by a function invoked by JS
public static async Task<RootObjectClass<T>> genericGet<T>(string function, string parameters)
{
    try
    {
        // create credentials to pass to httpClient
        var httpClientCredentials = new HttpClientHandler()
        {
            Credentials = new NetworkCredential(uberAPIUser, uberAPIPass)
        };

        using (var client = new HttpClient(httpClientCredentials))
        {
            // unsure if the headers are being passed in correctly - getting good response though
            client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded");
            var response = await client.GetAsync(ubersmithURL + function + parameters);
            var result = await response.Content.ReadAsStringAsync();
            // remove nulls from json
            result = Regex.Replace(result, ":null,", ":\"\",");
            var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
            var success = JsonConvert.DeserializeObject<RootObjectClass<T>>(result);
            return success;
        }
    }
    catch(Exception ex)
    {
        // log error
    }
    return new RootObjectClass<T>();
}

1 个答案:

答案 0 :(得分:1)

虽然这可能 没有完全解决问题 ,但您不应该返回C#数据类型,因为JavaScript将无法解析它们并导致在最坏的情况下与此类似的错误

  

System.Collections.Generic.List`1 [...]

就像我在评论中所说,您应该从控制器返回JsonResult以检索JS中的数据。

[Route("cloud/getTicketCount")]
public JsonResult getTicketCount()
{
    var tickets = Dashboard.getTODTickets("On Hold"); 
    return Json(tickets ,JsonRequestBehavior.AllowGet);
}

Understanding JsonRequestBehavior.AllowGet

和您的Ajax调用

$.ajax({
    type: "GET",
    url: "/cloud/getTicketCount/",
    dataType: "json"
})
.done(function(data){
   console.log(data);
})
.fail(function(xhr){
    console.log(xhr.responseText); 
});

编辑:

我相信这是你遇到的僵局问题。 Perfect answer elaborating the issue is here.