mvc webapi跨域帖子[重复]
Posted
技术标签:
【中文标题】mvc webapi跨域帖子[重复]【英文标题】:mvc webapi cross domain post [duplicate] 【发布时间】:2012-10-12 15:38:30 【问题描述】:可能重复:CORS with WebAPI for XmlHttpRequest
我正在尝试将跨域 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 的工作原理 --> ***.com/privileges/vote-up 【参考方案1】:分别回答你的问题:
-
状态 204 不是错误,这意味着没有内容可返回,但一切正常。这是RFC2616中204的定义
10.2.5 204 无内容
服务器已完成请求,但不需要返回 实体主体,并且可能想要返回更新的元信息。这 响应可能包括新的或更新的元信息,形式为 entity-headers,如果存在应该与 请求的变体。
如果客户端是一个用户代理,它不应该改变它的文档视图 从导致发送请求的原因。这个回应是 主要目的是允许输入进行操作,而无需 导致用户代理的活动文档视图发生变化,尽管 任何新的或更新的元信息都应该应用于文档 当前在用户代理的活动视图中。
204 响应不能包含消息体,因此总是 由标题字段后的第一个空行终止。
-
您能详细说明您遇到的错误是什么吗? ASP.NET Web API 当前没有开箱即用的 JSONP 格式化程序。这是第三部分的实现:
-
在 Web API 中,您引用响应的方式不是通过 HttpContext。有多种访问方式。
第一种选择是直接定义action返回HttpResponse。
public HttpResponseMessage Get(int id)
var response = this.Request.CreateResponse();
response.StatusCode = HttpStatusCode.OK;
response.Headers.Add("Access-Control-Allow-Origin", "*");
return response;
第二种选择是使用ActionFilter:
// define action filter for cross domain
public class CrossDomainActionFilter : ActionFilterAttribute
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
bool needCrossDomain = true;
if (needCrossDomain)
actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
base.OnActionExecuted(actionExecutedContext);
// At Controller
// GET api/values/5
[CrossDomainActionFilter]
public string Get(int id)
return "value";
最后一个选项是使用MessageHandler:
public class CrossDomainMessageHandler : DelegatingHandler
protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
var response = await base.SendAsync(request, cancellationToken);
response.Headers.Add("Access-Control-Allow-Origin", "*");
return response;
【讨论】:
动作过滤器最简洁!而且它使用了框架的可扩展性,所以它确实是最好的答案+1 哦,伙计。我希望我能再次投票,我会一直回到这里:) +beer【参考方案2】:如果您想从 ajax 向另一个域发送信息,那么您需要使用 jsonp(注意这仅适用于 get 请求而不是 post 请求)。另一种选择(如果您控制两个域)是使用 ARR(应用程序请求路由)来欺骗浏览器认为请求是本地的,然后使用 ARR 将请求重写到另一个域。使用这种技术,您可以像平常一样使用简单的 ajax 获取和发布。
【讨论】:
以上是关于mvc webapi跨域帖子[重复]的主要内容,如果未能解决你的问题,请参考以下文章
AJAX跨域调用ASP.NET MVC或者WebAPI服务的解决方案
Ajax 请求请求 MVC WebAPI跨域问题;XMLHttpRequest cannot load
Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)
关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案