【问题标题】:CORS issue on Put关于 Put 的 CORS 问题
【发布时间】:2017-07-03 04:42:51
【问题描述】:

当我向我的 Api 发送一个 put 时,我首先得到方法 OPTIONS 和一个错误。然后它再次点击我的选择操作方法并包含放置信息。

  public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
        {
            var request = controllerContext.Request;
            if (request.IsInspectRequest())
            {
                var simulate = new ActionSelectSimulator();
                request.Properties[RequestHelper.ActionCache] = simulate.Simulate(controllerContext);
            }

            var selectedAction = _innerSelector.SelectAction(controllerContext);

            return selectedAction;
        }

我有一个类可以处理我的预检请求。

   public class XHttpMethodOverrideHandler : DelegatingHandler
    {
        static readonly string[] httpOverrideMethods = { "PUT", "DELETE" };
        static readonly string[] accessControlAllowMethods = { "POST", "PUT", "DELETE" };
        static readonly string httpMethodOverrideHeader = "X-HTTP-Method-Override";
        static readonly string ORIGIN_HEADER = "ORIGIN";
        static readonly string accessControlAllowOriginHeader = "Access-Control-Allow-Origin";
        static readonly string accessControlAllowMethodsHeader = "Access-Control-Allow-Methods";
        static readonly string accessControlAllowHeadersHeader = "Access-Control-Allow-Headers";

        protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            try
            {
                if (request.Method == HttpMethod.Post && request.Headers.Contains(httpMethodOverrideHeader))
                {
                    var httpMethod = request.Headers.GetValues(httpMethodOverrideHeader).FirstOrDefault();
                    if (httpOverrideMethods.Contains(httpMethod, StringComparer.InvariantCultureIgnoreCase))
                        request.Method = new HttpMethod(httpMethod);
                }

                var httpResponseMessage = base.SendAsync(request, cancellationToken);

                if (request.Method == HttpMethod.Options && request.Headers.Contains(ORIGIN_HEADER))
                {
                    httpResponseMessage.Result.Headers.Add(accessControlAllowOriginHeader, request.Headers.GetValues(ORIGIN_HEADER).FirstOrDefault());
                    httpResponseMessage.Result.Headers.Add(accessControlAllowMethodsHeader, String.Join(", ", accessControlAllowMethods));
                    httpResponseMessage.Result.Headers.Add(accessControlAllowHeadersHeader, httpMethodOverrideHeader);
                    httpResponseMessage.Result.StatusCode = HttpStatusCode.OK;
                }
                else if (request.Headers.Contains(ORIGIN_HEADER))
                    httpResponseMessage.Result.Headers.Add(accessControlAllowOriginHeader, request.Headers.GetValues(ORIGIN_HEADER).FirstOrDefault());

                return httpResponseMessage;
            }
            catch (Exception ex)
            {
                ILoggerService logger = IocContainer.Container.TryGetInstance<ILoggerService>();
                if (logger != null)
                {
                    logger.Error(ex);
                }
                return Task.FromResult<HttpResponseMessage>(request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex));
            }

我也添加到了我的 webconfig 中

 <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>

当我发送我的 Put Ajax 调用时,我收到一个错误。它命中了我的方法并执行了我的操作,但它发送了一个错误。如果我通过邮递员发送 put 请求,那么我没有问题。如果我从客户端发送它,我会收到一个错误,因为它获得的第一个方法是 {OPTIONS}。我错过了什么? 这是我的 Ajax 放置

  $.ajax({
                    url: "http://localhost:61148/api/mycontroller",
                    contentType: "application/x-www-form-urlencoded; charset=UTF-8",
                    async: true,
                    type: "PUT",
                    data: sendData,
                    datatype: 'json',
                    crossDomain: true,
                    success: function () {

【问题讨论】:

    标签: asp.net-mvc api cors


    【解决方案1】:

    我在其他几个问题中找到了答案。解决方法很简单,很痛苦。如果您遇到此问题,请在控制器中添加选项方法。

    public HttpResponseMessage Options()
    {
        var response = new HttpResponseMessage
        {
            StatusCode = HttpStatusCode.OK
        };
        return response;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2021-10-24
      • 2019-02-13
      • 1970-01-01
      • 2021-05-02
      • 2017-08-13
      • 2018-04-26
      • 2016-05-18
      • 1970-01-01
      相关资源
      最近更新 更多