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

函数在被JavaScript调用时不返回数据,javascript,c#,Javascript,C#,在使用单元测试进行调试时,函数返回预期的数据,但是当从JavaScript调用相同的函数时,函数会被命中,但不会返回任何数据 我在dll中调用的这个函数是挂起的,但是只有当它被JS请求调用的函数调用时,为什么会这样呢 编辑: 正如在评论中一样,我的最佳猜测是,这与正在使用的线程有关,但我不知道,因为函数本身正在工作,只是从AJAX调用的C#函数调用时不知道 AJAX调用: function getOnHoldTickets() { $.ajax({ type: "GET"

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

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

编辑:

正如在评论中一样,我的最佳猜测是,这与正在使用的线程有关,但我不知道,因为函数本身正在工作,只是从AJAX调用的C#函数调用时不知道

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;
}
//JS调用命中api
[路由(“云/getTicketCount”)]
公共列表getTicketCount()
{
var tickets=Dashboard.getTODTickets(“暂停”);
回程票;
}
[TestMethod]//调用与JS相同的方法
公共票务()
{
var openTickets=Dashboard.getTODTickets(“暂停”);
var check=openTickets!=null;
}
//方法调用dll
公共静态列表getTODTickets(字符串类型)
{
var tickets=UberAPI.getTODTickets(类型);
回程票;
}
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>();
}
//由JS调用的函数调用时挂起的dll中的方法
公共静态异步任务genericGet(字符串函数、字符串参数)
{
尝试
{
//创建要传递给httpClient的凭据
var httpClientCredentials=new HttpClientHandler()
{
凭据=新网络凭据(uberAPIUser、uberAPIPass)
};
使用(var客户端=新的HttpClient(httpClientCredentials))
{
//不确定是否正确传递了标头-但得到了良好的响应
client.DefaultRequestHeaders.TryAddWithoutValidation(“内容类型”、“应用程序/x-www-form-urlencoded”);
var response=await client.GetAsync(URL+函数+参数);
var result=await response.Content.ReadAsStringAsync();
//从json中删除空值
result=Regex.Replace(结果,“:null,”,“:\”,”;
var ms=newmemoryStream(Encoding.UTF8.GetBytes(result));
var success=JsonConvert.DeserializeObject(结果);
回归成功;
}
}
捕获(例外情况除外)
{
//日志错误
}
返回新的RootObjectClass();
}
虽然这可能无法完全解决问题,但您不应该返回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);
}

还有你的Ajax电话

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


我相信这是一个僵局问题

这是WebAPI还是MVC?您不应该返回c#数据类型,而应该返回JsonResult并将列表解析为Json。看起来API需要用户名和密码。作为网站运行代码时,是否确实正确配置了凭据?用户名和密码在dll中是硬编码的。它还可以使用单元测试,所以不能是这样。我最好的猜测是与正在使用的线程有关,但我对此知之甚少。这是MVC@MadOXThis根本没有解决这个问题。@JLRishe我非常确信传递诸如List之类的对象会导致我上面指定的错误。不是实际的错误,但将返回返回的类型的字符串,因此需要序列化。如果你能为我自己的学习目的详细说明一下,谢谢。谢谢你,这可能会成为今后的一个问题,我会在整理好后解决。。但是,JavaScript目前没有抛出错误,因为它没有获取数据,
genericGet
在函数被JS调用时冻结/挂起。@PurpleSmurph再次看到您的帖子,我认为这是一个死锁,因为数据是从DLL返回的,但我可能是错的。看看编辑。这似乎很可能,谢谢你的链接,我们会看看的。