c#-405(不允许使用方法)从Angular 2应用进行POST时

Aw3same

我对这个问题有些绝望。我是angular 2和.net的新手,我试图构建一个简单的应用程序。我在C#中编写了一个api rest。当我从角度调用GET方法时,它可以正常工作,但不能使用POST方法。我一直都收到405(不允许使用方法),但是如果我与邮递员联系,则一切正常。我看到很多问题都存在相同的问题,但是它们对我不起作用。我启用了CORS。这是我的代码:

角度的

    sendPtipo(delegacion,municipio,ejercicio,recinto,tipo){
    let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' });
    let options = new RequestOptions({ headers: headers });
    let urlPtipo ='http://localhost:50790/ApiProductoTipo/CalculaPTRecinto';
    let body ='delegacion='+delegacion+'&municipio='+municipio+'&recinto='+recinto+'&ejercicio='+ejercicio+'&tipo'+tipo;

return this._http.post(urlPtipo , body , options)
               .map(data => {alert('ok');})
               .catch(this.handleError);
}

private extractData(res: Response) {
    let body = res.json();
    return body.data || {};
}

private handleError(error: Response) {
    console.error(error);
    return Observable.throw(error.json().error || 'Server error');
}}

Api在C#中休息

using System.Collections.Generic;
using System.Web.Http;
using AppName.Models;
using AppName.Service;
using System.Linq;
using AppName.ViewModels;
using System.Net.Http;
using System.Net;
using System.Web.Http.Cors;

namespace Api.Services
{
    // Allow CORS for all origins. (Caution!)
   //[EnableCors(origins: "*", headers: "*", methods: "*")]
    public class ApiProductoTipoController : ApiController
    {
        private readonly IProductoTipoService productoTipoService;

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

        public ApiProductoTipoController(IProductoTipoService productoTipoService)
        {
            this.productoTipoService = productoTipoService;
        }

        [HttpPost]
        [Route("~/ApiProductoTipo/CalculaPTRecinto")]
        public HttpResponseMessage CalculaPTRecinto([FromBody]int delegacion, int municipio, int ninterno, int ejercicio, string tipo)
        {        
            if (this.productoTipoService.CalculaPTRecinto(delegacion, municipio, ninterno, ejercicio, tipo) != 0)
            {
                return Request.CreateResponse(HttpStatusCode.OK);
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest);
            }
        }
    }}

webapiconfig.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.Http.Cors;

namespace Web
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            //Enable cors
            var cors = new EnableCorsAttribute("*", "accept,accesstoken,authorization,cache-control,pragma,content-type,origin", "GET,PUT,POST,DELETE,TRACE,HEAD,OPTIONS");

            //var cors = new EnableCorsAttribute("*", "*", "*");

            config.EnableCors(cors);

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

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


    }
}

日志记录

headers:Headers
ok:false
status:405
statusText:"Method Not Allowed"
type:2
url:"http://localhost:50790/ApiProductoTipo/CalculaPTRecinto"
_body:"{"Message":"The requested resource does not support http method 'POST'."}"

任何的想法?感谢您的阅读!

编辑:这是邮递员200的响应

Cache-Control →no-cache
Content-Length →0
Date →Fri, 26 May 2017 09:48:05 GMT
Expires →-1
Pragma →no-cache
Server →Microsoft-IIS/10.0
X-AspNet-Version →4.0.30319
X-Powered-By →ASP.NET
X-SourceFiles →=?UTF-8?B?QzpcVXNlcnNcNzAyNTU3MjFKXERlc2t0b3BcQXBpUHJvZHVjdG9UaXBvXFdlYlxBcGlQcm9kdWN0b1RpcG9cQ2FsY3VsYVBUUmVjaW50bw==?=
shi下

您的代码似乎还可以,请尝试更改代码,如下所示:

角度的

sendPtipo(delegacion: number,municipio: number,ejercicio: number,recinto: number,tipo: string){

        let data = new Object();
        data.delegacion = delegacion;
        data.municipio = municipio;
        data.ejercicio = ejercicio;
        data.recinto = recinto;
        data.tipo = tipo;

        let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' });
        let options = new RequestOptions({ headers: headers });
        let urlPtipo ='http://localhost:50790/ApiProductoTipo/CalculaPTRecinto';

    return this._http.post(urlPtipo , data , options)
                   .map(data => {alert('ok');})
                   .catch(this.handleError);
    }

    private extractData(res: Response) {
        let body = res.json();
        return body.data || {};
    }

    private handleError(error: Response) {
        console.error(error);
        return Observable.throw(error.json().error || 'Server error');
    }}

C#中的API

using System.Collections.Generic;
using System.Web.Http;
using AppName.Models;
using AppName.Service;
using System.Linq;
using AppName.ViewModels;
using System.Net.Http;
using System.Net;
using System.Web.Http.Cors;

namespace Api.Services
{
    // Allow CORS for all origins. (Caution!)
   //[EnableCors(origins: "*", headers: "*", methods: "*")]
    public class ApiProductoTipoController : ApiController
    {
        public class myobj{
            public int delegacion { get; set; }
            public int municipio { get; set; }
            public int ejercicio { get; set; }
            public int recinto { get; set; }
            public string tipo { get; set; }

        }

        private readonly IProductoTipoService productoTipoService;

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

        public ApiProductoTipoController(IProductoTipoService productoTipoService)
        {
            this.productoTipoService = productoTipoService;
        }

        [HttpPost]
        [Route("~/ApiProductoTipo/CalculaPTRecinto")]
         public HttpResponseMessage CalculaPTRecinto(myobj data)
        {        
            var tipo = data.tipo;
            ...
        }
    }}

我面临着同样的问题。您要发送的数据的实际数据类型无法在API端获得。这就是为什么要这样做的原因405 error。因此,请尝试在API端将数据作为对象发送并作为对象接收。

希望这能够帮到你

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尝试发布AJAX请求时的POST 405(不允许使用方法)-Laravel 4

不允许使用方法“ POST”

Yii2:注销用户时不允许使用方法(#405)

405:不允许使用方法(对Flask进行AJAX查询)

csrf-token POST 405(不允许使用方法)Laravel

Ajax POST结果为405(不允许使用方法)-Spring MVC

405在将工件部署到Nexus时不允许使用方法

选项405(不允许使用方法)Web API 2

尝试使用React-SearchKit连接到ElasticSearch 7时出现错误405(不允许使用方法)

为什么此ASP.NET Core POST请求返回“ 405(不允许使用方法)”?

NGINX返回405不允许使用POST方法

URL Angular2 +打字稿Webapp不允许使用405方法

405不允许使用的方法Web API 2

修补注册时不允许使用方法

405不允许用于POST的方法

不允许ExpressJS 405 POST方法

405 DocuSign SOAP API C#客户端中不允许使用的方法

当我在ASP.NET WebAPI CORS中发送POST数据时,HTTP CODE 405(不允许使用方法)

尝试在Spring Boot / Spring Security Web应用程序中打开.css文件时,为什么会出现“ 405-不允许使用方法”错误?

“方法不允许(#405 状态代码)”从 C# 中的控制台应用程序将数据放在 Web api 上

Angular Web Api 2不适用于POST:405方法不允许

Web api 2 POST方法不允许使用405方法

不允许使用Django + Angular方法PUT和POST

POST 方法错误 HTTP 405(方法不允许)

Angular 不会在单击时淡出元素...405(不允许的方法)

使用 ajax 方法 post laravel 出现错误 405(方法不允许)

405方法不允许-使用jquery ajax方法调用wcf服务时

Appengine 405方法POST不允许

IIS 上不允许 405 方法 (POST)