13

我一生都无法弄清楚这一点。我有一个带有 Get 和 Post 方法的 web api 控制器。Get 方法无论有无参数都可以正常工作,但是当我尝试向其添加 String 参数时,帖子会中断。下面是我的代码。

路线:

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

控制器:

public class AuditController : ApiController
{
    public String Post(String test)
    {
        return "Success : " + test;
    }

    public String Get(String test)
    {
        return "Success : " + test;
    }
}

要求:

    var request = WebRequest.Create("http://localhost:42652/Audit");
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        using (var writer = new StreamWriter(request.GetRequestStream()))
        {
            writer.Write("test=TEST");
        }
        WebResponse webResponse = request.GetResponse();

我已经尝试了许多不同的请求,我觉得我缺少一些简单的东西。谢谢你的帮助。

4

2 回答 2

22

由于您期望参数test来自请求的主体,因此您需要使用FromBody属性来装饰它。示例:([FromBody]String test)。这不适用于其他复杂类型,例如:Employee隐式认为来自 Body 的类。

阅读 GET 请求。它应该只适用于来自查询字符串的测试/Audit?test=Mike

以下博客文章包含有关参数绑定的更多详细信息:http: //blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

另外,我看到您正在使用 WebRequest。您是否考虑过使用 System.Net.Http 中的 HttpClient 代替?

于 2013-06-11T15:51:21.007 回答
3

更改您AuditController以包含FromBody属性:

public class AuditController : ApiController
{
    public String Post([FromBody]String test)
    {
        return "Success : " + test;
    }

    public String Get(String test)
    {
        return "Success : " + test;
    }
}

参看。http://msdn.microsoft.com/en-us/library/system.web.http.frombodyattribute(v=vs.108).aspx

于 2013-06-11T15:48:32.420 回答