【发布时间】:2012-10-12 15:38:30
【问题描述】:
我正在尝试将跨域 ajax 发布到我的 webApi 项目。我对此没有什么麻烦:
1. 在更改我的 webapi 操作之前,我总是收到 204 错误
public void submit(Submission model)
到
public bool submit(Submission model)
不知道为什么,但现在我得到了200 OK 状态
2. 仍然是我的 ajax 触发错误回调。
3.很久以前我通过添加解决了这种跨域发帖的错误
HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
到我的控制器。但现在在 webApi 中,我是 : ApiController 固有的,这个技巧不起作用。显示编译器 Error an object reference is required for the non-static field, method, or property"System.Web.HttpContext.Response.get"
我试图通过dataType: 'JSONP' 发帖,但我得到了空模型。
这里是 Javascript 请求:
我做错了什么?
已解决
感谢大家帮助我。我在其中一个评论链接中找到了解决方案。我使用了以下方法,我觉得这很简单。
来源:
Implementing CORS support in ASP.NET Web APIs
我做了什么:
1. 在我的项目中创建新类:CorsHandler.cs 并复制粘贴以下代码:
public class CorsHandler : DelegatingHandler
{
const string Origin = "Origin";
const string AccessControlRequestMethod = "Access-Control-Request-Method";
const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
const string AccessControlAllowMethods = "Access-Control-Allow-Methods";
const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";
protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
bool isCorsRequest = request.Headers.Contains(Origin);
bool isPreflightRequest = request.Method == HttpMethod.Options;
if (isCorsRequest)
{
if (isPreflightRequest)
{
return Task.Factory.StartNew(() =>
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
string accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault();
if (accessControlRequestMethod != null)
{
response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod);
}
string requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders));
if (!string.IsNullOrEmpty(requestedHeaders))
{
response.Headers.Add(AccessControlAllowHeaders, requestedHeaders);
}
return response;
}, cancellationToken);
}
else
{
return base.SendAsync(request, cancellationToken).ContinueWith(t =>
{
HttpResponseMessage resp = t.Result;
resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
return resp;
});
}
}
else
{
return base.SendAsync(request, cancellationToken);
}
}
}
- 打开了我的
Global.asax,修改了Application_Start:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configuration.MessageHandlers.Add(new CorsHandler());
}
注意最后一行。
这种方法与 MVC3 和 .NET 4.0 兼容。效果很好,现在我可以在 ajax 中处理“成功”和“错误”回调了。
【问题讨论】:
-
你在使用 jQuery 吗?您可以为此发布您的 javascript 示例吗?
-
如果建议问题的答案之一对您有帮助,您应该投票赞成,这就是 SO 的工作原理 --> stackoverflow.com/privileges/vote-up
标签: asp.net-web-api cors