2017-05-26 183 views
3

我有点绝望这个问题。我是新的角2和.net,我试图建立一个简单的应用程序。我在c#中编写了api rest。当我从角度调用GET方法时,它工作正常,但不是POSTmethod。我总是收到405(方法不允许),但是如果我和邮递员一起打电话给所有作品。我发现许多问题都出在同一个问题上,但他们对我来说并不合适。 我启用了CORS。 这里是我的代码:c# - 405(方法不允许)当从角2应用POST POST

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'); 
}} 

阿比休息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 OK的响应

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==?= 
+0

你的邮递员请求是什么样的? –

回答

6

你的代码似乎ok.Try更改代码,我已经给下面:

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; 
      ... 
     } 
    }} 

我面临同样的数据issue.The实际的数据类型,你SRE发送的API side.That的不能明白为什么它给405 error。那么尝试发送数据作为对象,也接收为对象在API方面。

希望这会帮助你

+0

谢谢!这样可行!但现在我有另一个问题。而不是使用一个对象,我使用这种结构的数组: 'let data:Ptipo [] = []; data.push({ 'Delegacion':delegacion, 'MUNICIPIO':MUNICIPIO, 'Ejercicio':ejercicio, 'Tipo_Producto':TIPO, 'Ninterno':recinto});' 但我不明白任何值的参数:/ – Aw3same

+0

@ Aw3same在服务器端,你没有得到params的价值? – Darshita

+0

是的,我有你提供给我的方法('公共类myobj'),然后得到像'var delegacion = data.delegacion;'的值,但是当我调试那些参数没有任何价值 – Aw3same

相关问题