Asp.net web api mvc webapi跨域post
可能重复:Asp.net web api mvc webapi跨域post,asp.net-web-api,cors,Asp.net Web Api,Cors,可能重复: 我正试图在我的webApi项目中实现跨域ajax post。我对此没有什么问题: 1.在更改webapi操作之前,我总是收到204个错误 到 不知道为什么,但现在我得到了200 OK状态 2.仍然是我的ajax触发错误回调 3.很久以前,我通过添加 给我的控制器。但是现在在webApi中,我是天生的:ApiController,而这个技巧不起作用。显示编译器错误非静态字段、方法或属性“System.Web.HttpContext.Response.get”需要对象引用“ 我
我正试图在我的webApi项目中实现跨域ajax post。我对此没有什么问题:
1.在更改webapi操作之前,我总是收到204个错误 到 不知道为什么,但现在我得到了
200 OK
状态2.仍然是我的ajax触发错误回调
3.很久以前,我通过添加 给我的控制器。但是现在在webApi中,我是天生的
:ApiController
,而这个技巧不起作用。显示编译器错误非静态字段、方法或属性“System.Web.HttpContext.Response.get”需要对象引用“
我试图通过
数据类型发布:“JSONP”
,但我得到了空模型下面是Javascript请求: var model = { "type": $("#model-type").val(), "subject": $("#subject-text").val(), "body": $("#body-text").val() }; $.ajax({ type: "POST", dataType: 'JSONP', url: $("#submit-url").val(), data: model, success: function () { alert("Succesfully submitted"); }, error: function () { alert("Error..."); } });
Global.asax
并修改应用程序\u Start
:这种方法与MVC3和.NET4.0兼容。非常好,现在我可以在ajax中处理“成功”和“错误”回调。如果您想从ajax向另一个域发送信息,那么您需要使用jsonp(注意,这只适用于get请求而不是post请求)。另一种选择(如果您控制两个域)是使用ARR(应用程序请求路由)诱使浏览器认为请求是本地的,然后使用ARR将请求重写到另一个域。使用此技术,您可以像正常情况一样使用简单的ajax GET和POST。分别回答您的问题:
- 我希望他们能帮上忙
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";
}
最后一个选项是使用:
公共类CrossDomainMessageHandler:DelegatingHandler
{
受保护的异步覆盖任务SendAsync(
HttpRequestMessage请求,
取消令牌(取消令牌)
{
var response=await base.sendaync(请求、取消令牌);
添加(“访问控制允许源代码”、“*”);
返回响应;
}
}
您正在使用jQuery吗?您可以为此发布一个javascript示例吗?如果建议的问题中的一个答案对您有所帮助,您应该对此进行投票,这就是它的工作原理-->Action filter是最简洁的!而且它使用了框架的可扩展性,所以它确实是最好的答案+1ohman。我希望我能再次投票,我一直回到这里:)+啤酒
var model = {
"type": $("#model-type").val(),
"subject": $("#subject-text").val(),
"body": $("#body-text").val()
};
$.ajax({
type: "POST",
dataType: 'JSONP',
url: $("#submit-url").val(),
data: model,
success: function () {
alert("Succesfully submitted");
},
error: function () {
alert("Error...");
}
});
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);
}
}
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configuration.MessageHandlers.Add(new CorsHandler());
}
public HttpResponseMessage Get(int id)
{
var response = this.Request.CreateResponse();
response.StatusCode = HttpStatusCode.OK;
response.Headers.Add("Access-Control-Allow-Origin", "*");
return response;
}
// 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";
}
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;
}
}