web-dev-qa-db-ja.com

Asp.net Web APIを使用したAngularJS:XMLHttpRequestを返す$ http postを読み込めません:プリフライトの応答に無効なHTTPステータスコード405があります

$httpを使用してAsp.netWebAPIサーバーにPOST jsonを送信しようとすると、次のエラーが返されます

XMLHttpRequest cannot load http://localhost:62158/api/video/add.
Response for preflight has invalid HTTP status code 405

しかし、$.ajaxから同じリクエストを行うことは作業ファイルです。

$ HTTPコード

$http.post(url, data, config)
    .success(function (data, status, headers, config) {
        defered.resolve(data);
    })
    .error(function (data, status, header, config) {
        defered.reject(data);
    });

$。ajaxコード

$.ajax({ type: "POST",
    url: url,
    data: newVideo,
    success: function (a) {
         debugger;
    },
    error: function (e) {
       debugger;
    },
    dataType: 'json'
});

asp.net Web APIコードと構成

web.config

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE,     OPTIONS" />
    </customHeaders>
</httpProtocol>

WebApiConfig

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );


    VideoLIbraryDb.Config.setconnection();

    var formatters = GlobalConfiguration.Configuration.Formatters;

    formatters.Remove(formatters.XmlFormatter);

    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));


}

APIコントローラ

[RoutePrefix("api/video")]
    public class VideoController : ApiController
    {
        [Route("add")]
        [HttpPost]
        public HttpResponseMessage add([FromBody] db_videos newVideo)
        {
            HttpStatusCode statusCode = HttpStatusCode.NotFound;

            CommonResult result = new CommonResult() /// default
            {
                code = ResultCodes.retry.ToString(),
                message = "Not able to complete request. Retry."
            };

            if (newVideo.video_file_name == null)
                return Request.CreateResponse(statusCode, result);

            if (newVideo.video_file_name.Length < 1)
                return Request.CreateResponse(statusCode, result);


            if (newVideo.insert())
            {
                statusCode = HttpStatusCode.OK;
                result.code = ResultCodes.successfull.ToString();
                result.message = "Video is added";
            }

            return Request.CreateResponse(statusCode, result);
        }
    }
11
Vikas Bansal

@ Rakeschandあなたは正しかったし、それはcorsの問題でした

Cors

Nu-getコマンドラインを使用してプロジェクトにCorsをインストールしました

Install-Package Microsoft.AspNet.WebApi.Cors

app_StartフォルダーからWebApiConfig.csファイルに次のコードを追加しました。

var enableCorsAttribute = new EnableCorsAttribute("*",
                                               "Origin, Content-Type, Accept",
                                               "GET, PUT, POST, DELETE, OPTIONS");
config.EnableCors(enableCorsAttribute);

そして、Web設定から以下を削除しました

   <remove name="X-Powered-By" />
                    <add name="Access-Control-Allow-Origin" value="*" />
                    <add name="Access-Control-Allow-Headers" value="Accept, Content-Type, Origin" />
                    <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />

$ httpは、$.ajaxが機能していたのと同じように機能し始めました

しかし、これらのことは私にいくつかの混乱を残しました。誰かが詳しく説明できれば私は大いにいっぱいになるでしょう

  1. $.ajaxが機能し、$httpが機能しなかった理由
  2. web.configで行ったのと同じことをcorsで行いましたが、corsは機能したのに、web.configは機能しなかったのはなぜですか?
20
Vikas Bansal

私はあなたのajax呼び出しでコンテンツタイプを設定する必要があると思います:

contentType: 'application/x-www-form-urlencoded; charset=utf-8',

または

contentType: 'application/json; charset=utf-8',
2
Tiago Gouvêa