【问题标题】:500 Server Error when calling RESTFUL Web API over HTTP通过 HTTP 调用 RESTFUL Web API 时出现 500 服务器错误
【发布时间】:2014-08-06 23:22:46
【问题描述】:

我的 WEB API 控制器具有以下结构:

public class MyController : ApiController
{
   [System.Web.Http.HttpPost]
   public bool Method1([FromBody] int id, [FromBody] string token, [FromBody] string deviceID, [FromBody] string username)
   {
      bool returnValue = false;

      //do code business logic here

      return returnValue;
   }

   [System.Web.Http.HttpPost]
   public bool Method2([FromBody] int id, [FromBody] string token)
   {
      bool returnValue = false;

      //do code business logic here

      return returnValue;
   }
}

当我尝试通过 HTTP 为 Method1Method2 创建 RESTFUL Web API 时,我收到 500 内部服务器错误。

如果我从任何一种方法中删除输入参数,我就可以制作 Web API 而不会出错。

我已经通过 .NET 测试方法对控制器进行了单元测试,并且逻辑不会产生异常。

我添加了一个名为Get 的附加方法,没有任何参数,并且能够使用该服务而没有任何错误。

这是我尝试使用 jQuery 在 JavaScript 中使用 Web API 的代码 sn-p:

var uri = "http://127.0.0.1/MyWebApi/api/mycontroller/method2";

var myObject =
{
    id: $('#id').val(),
    token: $('#token').val()
};

$.post(uri, JSON.stringify(myObject)).done(function (data) {
    $('#result').text(data);
})
.fail(function (jqXHR, textStatus, err) {
    $('#result').text('Error: ' + err);
});

是什么导致我在初始 API 控制器结构上收到 500 内部服务器错误?

【问题讨论】:

    标签: c# asp.net-mvc-4 asp.net-web-api2 restful-url


    【解决方案1】:

    考虑到您使用的 HTTP 方法 (POST),此 500 错误可能是因为它没有在服务器中为给定参数找到匹配的操作。

    myObject不应该这样吗? (令牌而不是令牌)

    var myObject =
    {
        id: $('#id').val(),
        token: $('#token').val()
    };
    

    此外,您不需要对 JSON 对象进行字符串化。如果应该像这样工作:

    $.post(uri, myObject).done(function (data) {
        $('#result').text(data);
    })
    .fail(function (jqXHR, textStnatus, err) {
        $('#result').text('Error: ' + err);
    });
    

    【讨论】:

    • 这是我的客户端代码中用于使用服务的拼写错误。我确实在 WebApiConfig.cs 中将操作定义为 api/{controller}/{action}
    【解决方案2】:

    来自documentation关于[FromBody]

    消息体最多允许读取一个参数。

    因此,您必须创建一个与您发布为主体的参数相匹配的模型。

    【讨论】:

    • 也许我应该阅读文档...:)。我能够克服 500 内部服务器错误,但现在我在 JSON 对象中发送的所有值都没有发送过来。
    • 我能够使用 System.Net.WebRequest 对象从 Xamarin 移动应用程序中获取 Restful Web API 以工作,但无法通过 HTML/jQuery 调用使其工作。
    • 你必须将内容类型设置为application/json。
    【解决方案3】:

    我遇到了同样的错误,我花了很长时间才弄清楚是什么原因造成的。 最简单的方法是从浏览器检查您的响应消息。在 IE11 中,您可以按 F12,转到网络选项卡并开始录制。然后在您拨打电话后停止并查看通话。 就我而言,我发现我返回的消息无法序列化,因为我将要接收的对象中存在循环链接。因此,通过对 Web API 方面的一些细微调整,我设法让它工作得很好。所以请检查您的回复 - 您可能会获得有关该错误的更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多