我正在尝试将跨域 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请求:
变种模型 = { "类型": $("#model-type").val(), "主题": $("#subject-text").val(), "正文": $("#body-text").val() }; $.ajax({ 类型:“发布”, 数据类型:'JSONP', url: $("#submit-url").val(), 数据:模型, 成功:函数(){ alert("提交成功"); }, 错误:函数(){ alert("错误..."); } });
我做错了什么?
解决了
感谢大家帮助我。我在其中一个评论链接中找到了解决方案。我使用了以下方法,我觉得这很简单。
资料来源:
在 ASP.NET Web API 中实现 CORS 支持
我做了什么:
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 中处理“成功”和“错误”回调。