C#没有接收帖子

时间:2018-02-02 09:51:58

标签: c# json asp.net-web-api

我正在用C#制作一个webapi应用程序。我正在使用postman将请求发送到api,但是在调用函数时,接收的参数为null。

似乎C#没有看到帖子消息的任何内容。

这是我的WebApiConfig.cs

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

namespace Lab1_v5
{
    public static class 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}/{action}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

这是控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Lab1_API.Models;
namespace Lab1_API.Controllers
{
    public class OperacionController : ApiController
    {
        public Operacion ProcesarResultado(Operacion op)
        {
            return Models.Operacion.Procesar(op);
        }


    }
}

这是模型:

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

namespace Lab1_API.Models
{
    public class Operacion
    {

        private double value1, value2, resultado;
        private int tipoOperacion;

        public double Value1 { get => value1; set => value1 = value; }
        public double Value2 { get => value2; set => value2 = value; }
        public double Resultado { get => resultado; set => resultado = value; }
        public int TipoOperacion { get => tipoOperacion; set => tipoOperacion = value; }

        public Operacion(double pvalue1, double pvalue2, double presultado, int ptipoOperacion)
        {
            this.Value1 = pvalue1;
            this.Value2 = pvalue2;
            this.Resultado = presultado;
            this.TipoOperacion = ptipoOperacion;
        }

        public Operacion(double pvalue1, double pvalue2, int ptipoOperacion)
        {
            this.Value1 = pvalue1;
            this.Value2 = pvalue2;
            this.Resultado = 0;
            this.TipoOperacion = ptipoOperacion;
        }

        public static Operacion Procesar(Operacion op)
        {
            double result = 0;
            switch (op.tipoOperacion)
            {
                case 1: 
                    result = op.Value1 + op.Value2;
                    break;
                case 2: 
                    result = op.Value1 - op.Value2;
                    break;
                case 3: 
                    result = op.Value1 * op.Value2;
                    break;
                case 4: 
                    result = op.Value1 + op.Value2;
                    break;
            }
            op.resultado = result;
            return op;
        }
    }


}

我发送的是带有标题"application/json"的Json:

{
    "Value1":1.0,
    "Value2":1.0,
    "Resultado":0.0,
    "TipoOperacion":1
}

我已经尝试过几乎所有的东西,我似乎无法理解为什么我在控制器中得到一个null。

编辑 -

我用来访问webapi的网址是:http://localhost:55236/api/Operacion/ProcesarResultado

6 个答案:

答案 0 :(得分:2)

您需要添加HttpPost属性或使用Post。

启动方法名称
[HttpPost]
public Operacion ProcesarResultado(Operacion op)
{
    return Models.Operacion.Procesar(op);
}

public Operacion PostProcesarResultado(Operacion op)
{
    return Models.Operacion.Procesar(op);
}

答案 1 :(得分:1)

您应该指定请求的标头。尝试添加

Content-Type: application/json

答案 2 :(得分:1)

您需要指定控制器上的方法用于POST请求。使用HttpPost属性。

    [HttpPost]
    public Operacion ProcesarResultado(Operacion op)
    {
        return Models.Operacion.Procesar(op);
    }

答案 3 :(得分:0)

您可以尝试使用FromBodyAttribute标记参数,如下所示:

[HttpPost]
public Operacion ProcesarResultado([FromBody] Operacion op)
{
    return Models.Operacion.Procesar(op);
}

这应该建议反序列化请求体的框架。没有它,它可能会期待表单数据。

答案 4 :(得分:0)

问题在于您的构造函数。 快速解决: 只需添加无参数构造函数:

public Operacion()
            {
            }

并且不要忘记正确命名您的操作(使用:Post开始操作名称)或在操作定义之前添加[HttpPost]属性(如果您将其保留为此可能会增加更多问题)。

答案 5 :(得分:0)

除了可能没有将您的方法标记为接受POST请求之外,您的模型缺少无参数构造函数。它应该是

public class Operacion
{

    private double value1, value2, resultado;
    private int tipoOperacion;

    public double Value1 { get => value1; set => value1 = value; }
    public double Value2 { get => value2; set => value2 = value; }
    public double Resultado { get => resultado; set => resultado = value; }
    public int TipoOperacion { get => tipoOperacion; set => tipoOperacion = value; }

    public Operacion()
    {
    }

    // other constructors and methods
}

框架需要无参数构造函数来实例化您的类,因为它不能使用带有参数的构造函数,因为它不知道如何填充它们。

如果您的模型没有明确声明任何构造函数,则会自动生成默认的无参数构造函数。