Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net web api mvc webapi跨域post_Asp.net Web Api_Cors - Fatal编程技术网

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。

    分别回答您的问题:

  • 状态204不是一个错误,这意味着没有内容返回,但一切都很好。这里是204的定义
  • 10.2.5 204无内容

    服务器已完成请求,但不需要返回 实体主体,并且可能希望返回更新的元信息。这个 响应可能包括以下形式的新的或更新的元信息: 实体标题,如果存在,则应与 请求的变体

    如果客户端是用户代理,则不应更改其文档视图 从导致发送请求的。这一回应是正确的 主要目的是允许输入操作,而无需 导致更改用户代理的活动文档视图,但 任何新的或更新的元信息都应应用于文档 当前在用户代理的活动视图中

    204响应不能包括消息体,因此总是 由标题字段后的第一个空行终止

  • 你能说清楚你遇到了什么错误吗?ASP.NET Web API当前没有现成的JSONP格式化程序。下面是一些第三部分实现:

    • 我希望他们能帮上忙
  • 在Web API中,引用响应的方式不是通过HttpContext。有多种访问方式

  • 第一个选项是直接定义操作返回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";
    }
    
    最后一个选项是使用:

    公共类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;
        }
    }