ajax不等待C#Server';s响应并调用错误函数,在本地主机上测试

ajax不等待C#Server';s响应并调用错误函数,在本地主机上测试,c#,jquery,ajax,owin,C#,Jquery,Ajax,Owin,在用户端,我有一个javascript代码,通过JQuery.ajax发布到服务器。在服务器端,我接收请求并处理它,但用户端脚本不等待服务器响应并调用error:getFail(见下文)函数。 编辑:问题是由于服务器和用户端位于不同的域上,在我的例子中是不同的本地主机。请参见下面@Jacob的详细回答。 如何检查用户端是否等待服务器? 我刚刚在调试模式下运行了服务器,并设置了一个断点,用于接收POST-ed值。用户端已经调用了error函数 有谁能告诉我,为什么它不能“正常”工作,或者错误的来

在用户端,我有一个javascript代码,通过JQuery.ajax发布到服务器。在服务器端,我接收请求并处理它,但用户端脚本不等待服务器响应并调用error:getFail(见下文)函数。

编辑:问题是由于服务器和用户端位于不同的域上,在我的例子中是不同的本地主机。请参见下面@Jacob的详细回答。

如何检查用户端是否等待服务器?
我刚刚在调试模式下运行了服务器,并设置了一个断点,用于接收POST-ed值。用户端已经调用了error函数

  • 有谁能告诉我,为什么它不能“正常”工作,或者错误的来源是什么
我怀疑的是JQuery.ajax函数的数据类型参数是“不正确”行为的来源之一。它应该指定服务器返回值的预期类型。我不确定该设置什么,所以我没有指定希望默认设置会发现什么

[对于数据类型参数]如果未指定任何参数,jQuery将尝试根据响应的MIME类型推断该参数。可能的类型有:xml、html、script、json、jsonp、text、multiple。(来源:,JQuery文档)


以下是代码:

用户端javascript代码:

function logIn() {
try {
    alert('try in logIn');
    jQuery.ajax({
        type: "POST",
        url: "http://localhost:8080/Token",
        cache: false,
        data: {
            "grant_type": "password",
            "username": document.getElementById("username").value,
            "password": document.getElementById("password").value
        },
        contentType: "application/x-www-form-urlencoded", // data type sent to server
        // dataType: "json", // data type expected from server <- THIS may be a source of the problem
        success: getSuccess,
        error: getFail
    });
} catch (e) {
    alert(e);
}
function getSuccess(data, textStatus, jqXHR) {
    alert(data.Response);
};
function getFail(jqXHR, textStatus, errorThrown) {
    //jqXHR.status is 0
    //textStatus is "error"
    //errorThrown is empty
    alert(jqXHR.status); // <-- THIS is what gets called, instantly after the post.
};
public class ApplicationOAuthServerProvider
    : OAuthAuthorizationServerProvider
{
    public override async Task ValidateClientAuthentication(
        OAuthValidateClientAuthenticationContext context)
    {
        await Task.FromResult(context.Validated()); // break-point was here
    }

    // This is called by await Task.FromResult(context.Validated())
    public override async Task GrantResourceOwnerCredentials(
        OAuthGrantResourceOwnerCredentialsContext context)
    {
        // Here manager will have correct values from the POST-ed data
        var manager = context.OwinContext.GetUserManager<ApplicationUserManager>();

        var user = await manager.FindAsync(context.UserName, context.Password);
        if (user == null)
        {
            context.SetError(
                "invalid_grant", "The user name or password is incorrect.");
            context.Rejected();
            return;
        }

        foreach (var userClaim in user.Claims)
        {
            identity.AddClaim(new Claim(userClaim.ClaimType, userClaim.ClaimValue));
        }

        context.Validated(identity);
    }
}
函数登录(){
试一试{
警报(“尝试登录”);
jQuery.ajax({
类型:“POST”,
url:“http://localhost:8080/Token",
cache:false,
数据:{
“授权类型”:“密码”,
“用户名”:document.getElementById(“用户名”).value,
“密码”:document.getElementById(“密码”).value
},
contentType:“application/x-www-form-urlencoded”,//发送到服务器的数据类型

//数据类型:“json”,//服务器所需的数据类型看到您返回的实际错误将证实/反驳这一点,但我看到CORS问题应对此负责。根据调用的方式和服务器支持的内容,您可能有一个飞行前请求,该请求由服务器处理,就好像它是完整的请求一样,然后客户端可以拒绝响应,因为它未经跨源授权

我不确定您的服务器端框架是什么,但如果这确实是一个跨源问题,这可能会有所帮助:


您应该发布您要返回的错误。错误状态是什么?感谢您指出。我已经更新了我的问题,将收到的错误作为注释包含在使用端代码中。此外,我将在此处写入:因此我得到jqXHR。状态为0。客户端和服务器的域匹配吗?听起来像是跨源问题对我来说。我在本地主机上运行。用户端是:服务端是:所以,我不确定它们是否匹配。:/不幸的是,它们被认为是不同的来源。