【问题标题】:c# web api not working as POST Typec# web api 不能作为 POST 类型工作
【发布时间】:2017-10-24 05:58:19
【问题描述】:

下面是我的 API 结构

 public class CustomController : ApiController
{
   [HttpPost]
    public DataSet POSTM(string StaffCode, string bytearray, string Reason)
   {
    //Some Business logic Here
   }
}

及其路线

 config.Routes.MapHttpRoute(
                name: "DefaultApi2",
                routeTemplate: "api/{controller}/{staffCode}/{bytearray}/{Reason}",
                defaults: new {
                    staffCode = RouteParameter.Optional,
                    bytearray = RouteParameter.Optional,
                    Reason = RouteParameter.Optional

                }
            );

我尝试从 jquery ajax 调用它

var data = {
            staffCode: staffCode_,
            bytearray: bytearray_,
            Reason: Reason_,
        };

        $.ajax(
            { url: 'http://localhost:59118/api/Custom/', 
             method : 'POST', 
             dataType: 'JSON', 
             data:data, 
             success: function (d) 
             { 
                 alert("Saved Successfully"); 

             }, 
             error: function (e) 
             { 
                 alert("Error please try again"); 
             } 
            });

调用它后,我在控制台日志中收到 500 Internal Server Error

但是,如果我将 [HttpPost] 更改为 [HttpGet],它就可以正常工作了

为什么它不能作为 POST 工作?

【问题讨论】:

  • 将 POST 方法中的参数更改为包含这 3 个属性的模型。还要注意只有路由定义中的最后一个参数可以标记为RouteParameter.Optional
  • 将参数更改为模型对象并从可选参数中删除了前两个参数,但仍显示内部服务器错误
  • 那么你的服务器代码抛出了异常。一个问题是你有 dataType: 'JSON', 但你的方法显然没有返回 JSON。
  • @Jack,当您在 ajax 请求中期待“JSON”时,为什么要从控制器方法返回 DataSet?你应该照顾好这个
  • 不要完全改变你的问题,并使已经给出的答案和cmet无效(我已经回滚了你的改变)。我建议您阅读this article 以了解为什么您需要 POST 方法的模型

标签: c# jquery asp.net-mvc asp.net-web-api2


【解决方案1】:

您正在使用POST 并在body 中发送数据,那么您需要像这样绑定模型

[HttpPost]
public DataSet POSTM(MyModel model)
{
  //Some Business logic Here
}

MyModel 将是一个类

public class MyModel 
{
  public string staffCode { get; set; }
  public string bytearray { get; set; }
  public string reason { get; set; }
}

【讨论】:

  • 您不需要[FromBody] - 这是默认设置
  • 仍然无法工作 - 模型只包含字段,不包含属性:)
  • @StephenMuecke 我只是不小心错过了这个。
  • 它不起作用。api类中还有其他方法,它如何在不修改或创建WebApiConfig中的路由的情况下工作
  • Its Same 505: Internal Server Error ,如果我以 get 方式运行它,则仍然没有错误
【解决方案2】:

默认情况下保留 web api 配置路由

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

那就试试这样称呼吧

    var staffCode = "staff code here";
    var bytearray = "hell byte arry";
    var Reason = "no reason";

    $.ajax(
        {
            url: 'http://localhost:51524/api/Test/POSTM/',
            method: 'post',
            data: JSON.stringify([staffCode, bytearray, Reason]),
            contentType: "application/json",
            dataType: 'json',
            success: function (data) {
                alert("Saved Successfully");

            },
            error: function (e) {
                alert("Error please try again");
            }
        });

控制器看起来像这样

 [HttpPost]
    public DataSet POSTM(List<string> data)
    {
      //ur code here
    }

接收来自 ajax 的请求

【讨论】:

  • 这不是最好的方法,因为在 URL 中传递复杂而冗长的数据是一个不受欢迎的限制。
  • @saif ,当我们从字节数组发送 Base64 编码字符串时显示错误,这就是我将其作为对象数组发送的原因
  • 试过但没有运行,可能是api类中的其他方法导致了这个问题
  • @Saif 我尝试了同样的方法,而不是我使用模型对象的列表。它现在使用 post 方法,但不发布值。值作为 null 传递
  • 您从哪里获得这些值?能否请您用硬编码值替换它以进行测试
【解决方案3】:

当您从 Ajax 发送数据时,

您的属性“staffCode”与控制器方法属性“StaffCode”不匹配。

属性名称区分大小写。

【讨论】:

  • 不,他们不是。模型绑定器不区分大小写
  • @Jack.. 如果您使用的是模型,请更新您的问题。它将帮助您获得正确的答案。
  • @DheerajKumar 更新
猜你喜欢
  • 2017-07-23
  • 1970-01-01
  • 2015-10-29
  • 2018-01-17
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
相关资源
最近更新 更多