我已经用尽了所有关于Cors的资源,并且在从Angular的$ http服务(通过Chrome)发送请求时仍然收到以下错误消息:
POST http://localhost:61459/api/LoginAuth/PostLoginByHandle 500 (Internal Server Error)
请求工作正常。我已经找到了一百种类似的指令,似乎对其他人有效,但我无法解决这个问题。我会发布我的代码。
WebApiConfig:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
//jsonFormatter.SerializerSettings = new CamelCasePropertyNamesContractResolver();
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
}
}
根据我的理解,这应该足以允许全球任何Cors请求。另外,我用控制器标记控制器:
[EnableCors(origins: "*", headers: "*", methods: "*")]
我已尝试使用我在网上找到的各种内容修改我的web.config,但我已经读过,以编程方式执行此操作时没有必要。知道我做错了吗?
我已经将这篇文章标记为angularjs,以防我在那里做错了,因为我对它很新。这是我的电话:
$http.post("http://localhost:61459/api/LoginAuth/PostLoginByHandle",this.LoginRequest).success(function(data){
testCtrl.user = data;
console.log("Retrieved: " + data);
});
**编辑:当我删除top方法时,我可以用Postman命中控制器。知道为什么这些会发生冲突吗?邮差给出了这个错误:
"Message": "An error has occurred.",
"ExceptionMessage": "Multiple actions were found that match the request: \r\nLoginByKey on type RecruitingTool.Web.Controllers.LoginAuthController\r\nPostLoginByHandle on type RecruitingTool.Web.Controllers.LoginAuthController"
这是控制器代码。我不明白为什么这些会发生冲突:
[HttpPost]
public LoginResult LoginByKey(LoginRequest req)
{
LoginResult l = new LoginResult();
if (!string.IsNullOrEmpty(req.Key) &&
HttpContext.Current.Cache["credentials." + req.Username.ToUpper()].ToString() == req.Key)
{
l.Success = true;
}
else
{
l.Success = false;
l.ErrorMessage = "The credentials key is not valid.";
}
return l;
}
[HttpPost]
[EnableCors(origins: "*", headers: "*", methods: "POST")]
public LoginResult PostLoginByHandle(LoginRequest req)
{
LoginResult l = new LoginResult();
if (req.Username.ToUpper() == "TESTUSER" && req.Password == "test")
{
//change to authenticate against DB
l.Success = true;
l.CredentialsKey = Guid.NewGuid().ToString();
l.ErrorMessage = "";
HttpContext.Current.Cache["credentials." + req.Username.ToUpper()] = Guid.NewGuid().ToString();
}
else
{
l.Success = false;
l.ErrorMessage = "The username or password is not correct. Please check your information and try again.";
}
return l;
}
**编辑2:问题是两种方法的默认路由之间存在冲突。我不确定为什么会出现这种情况,但是一旦我为它们指定了明确的路线,它就会被解决。如果有人知道,我仍然有兴趣知道答案。谢谢大家!
答案 0 :(得分:2)
如果你在你的Web API POST控制器中放置了一个断点,它是不是会命中它? HTTP 500通常表示您的代码存在一些问题(未处理的异常)。
如果它没有达到控制器动作,它必须在管道中更早。您是否尝试过从POSTman这样的方法直接发布到您的API方法?非常有用的Chrome扩展程序..
答案 1 :(得分:1)
WebAPI支持基于约定的路由:
要查找操作,Web API会查看HTTP方法,然后查找名称以该HTTP方法名称开头的操作。例如,对于GET请求,Web API会查找以“Get ...”开头的操作,例如“GetContact”或“GetAllContacts”。此约定仅适用于GET,POST,PUT和DELETE方法。您可以使用控制器上的属性启用其他HTTP方法。我们稍后会看到一个例子。
你确定你没有两种方法,一种叫做PostXXX,另一种叫做XXX?或者名为POSTxxx的那个可能会触发基于约定的路由。我已经看到提到“约定可能导致路由表中的冲突,匹配不正确的操作。”
尝试将您的方法重命名为Postxxx,Getxxx,...
以外的其他方法[PS属性路由要好得多]
答案 2 :(得分:1)
1-您的方法参数缺少[FromBody]属性,因此它应该像
public LoginResult PostLoginByHandle([FromBody]LoginRequest req)
2-此外,就参数数量和req参数的数据类型而言,两种方法都具有完全相同的签名。
希望有所帮助。答案 3 :(得分:0)
我今天遇到了同样的问题。事实证明问题出在飞行前的OPTIONS请求中。我使用了这个解决方案:Handling CORS Preflight requests to ASP.NET MVC actions
此外,我将标题添加到响应中,并从项目中删除了Microsoft.AspNet.WebApi.Cors:
pinchGesture()