将变量发布到Web API时出现内部服务器错误

时间:2017-09-19 13:29:45

标签: asp.net-mvc asp.net-web-api

我之前发布了一篇类似的帖子并得到了一些很好的答案,但我不小心删除了我的帖子,所以我发布的修订版本包含更多数据。

我正在构建一个Web API来发布并从我的视图中获取数据。与API通信效果很好,但我遇到了问题。

每当我发送带有帖子请求的数据时,我都会收到500:内部服务器错误。如果我从请求中删除数据,它可以正常工作。

有效的示例方法:

[HttpPost]
public string Test()
{
    return "this works";
}

因为我没有将任何数据传递给上述方法,所以我没有遇到任何问题。但是,每当我向我的请求添加一些数据时,就像这样:

API方法:

[HttpPost]

public string TestWithVariables(string test)
{
    return test;
}

AJAX电话:

 $.post({
        url: myUrl + "/api/my-api/TestWithVariables",
        data: { test: "123456" },
        success: function (html) {
            console.log("y")
        },
        error: function () {
            console.log("n");
        }
    });

上面的代码在我的浏览器中输出这些错误:HTTP / 1.1 500内部服务器错误和XML解析错误:找不到根元素。事实是,如果我在API方法的第一行设置一个断点,它永远不会被击中,这意味着找不到该方法,或者由于某种原因执行该方法......?

我尝试过的一些内容:将我的参数分解为TestClass并使用[FromBody]。我也尝试使用[FromUri],这实际上使方法执行,但我无法从那里访问值,因为我的值已发布在正文中。

任何想法可能导致这些问题?

3 个答案:

答案 0 :(得分:0)

根据您提供的数据,可能的问题可能是: 你没有使用stringify将数据转换为ajax请求中的字符串json。 使用以下

data:JSON.stringify({test:“123456”});

如果它不能共享您可以共享的控制器和其他数据。

答案 1 :(得分:0)

你可以做的几件事情,首先要确保你将请求的内容类型设置为json,默认情况下,如果你不这样做,它将是xml。

如果您不需要,也可以完全删除xml格式化程序。

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();

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

            config.Formatters.Clear();
            config.Formatters.Add(new JsonMediaTypeFormatter());
        }
    }

此课程位于App_Start。

无论哪种方式,都要确保正确设置内容类型。

最后确保在发送数据之前对数据进行字符串化:

var model = JSON.stringify({ test: "123456" });

$.post({
        url: myUrl + "/api/my-api/TestWithVariables",
        data: model,
        success: function (html) {
            console.log("y")
        },
        error: function () {
            console.log("n");
        }
    });

如果仍然无法正确击中控制器,请检查路线。

以没有参数的POST方法开始。一旦你可以点击它,添加一个参数并添加一个[FromBody]属性。

如果您收到500错误,则表示您在某处出现内部错误。在你的方法中放置一个断点,看你是否点击它。

现在,关于路线。让我们说你的控制器名为SomeController

您的路线将成为/某些/方法名称。 您可以使用控制器上的RoutePrefix属性和方法上的Route属性来完全控制路径。

说实话,我不会有这样的路线:/ api / my-api /

是的它是一个api,你的没有必要把它放在路线上。

因此,将您的RoutePrefix设置为api,并将您的路由设置为test-param然后您的网址变为:/ api / test-param例如

[RoutePrefix("api")]
public class TestController : ApiController

    [HttpPost]
    Route["test-param"]
    public string TestWithVariables([FromBody] string test)
    {
        return test;
    }

然后你的js:

var model = JSON.stringify({ test: "123456" });

$.post({
        url: myUrl + "/api/test-param",
        data: model,
        contentType: "application/json",
        success: function (html) {
            console.log("y")
        },
        error: function () {
            console.log("n");
        }
    });

我不确定contentType的正确语法,但它应该足够接近我想。

对于错误处理,我个人喜欢Elmah,一旦配置它会记录所有异常,您只需调用您的url / elmad.axd并查看所有错误报告。

最后一点,在构建API时使用一个好的客户端是个好主意。我喜欢邮差,因为它可以让你轻松地制作你需要的任何请求。一旦你在Postman中完成所有工作,你就可以在Javascript中构建该请求。

答案 2 :(得分:0)

控制器:

[HttpPost]
public string TestWithVariables([FromBody]string test) // added FromBody 
{
return test;
}

的Ajax:

$.post({
    url: myUrl + "/api/my-api/TestWithVariables",
    data: { test: "=123456" }, //prefix data with = sign
    success: function (html) {
        console.log("y")
    },
    error: function () {
        console.log("n");
    }
});