Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET WebApi Post方法-传递参数时为404_C#_Asp.net Web Api_Httpwebrequest - Fatal编程技术网

C# ASP.NET WebApi Post方法-传递参数时为404

C# ASP.NET WebApi Post方法-传递参数时为404,c#,asp.net-web-api,httpwebrequest,C#,Asp.net Web Api,Httpwebrequest,我一辈子都搞不清楚这件事。我有一个带有Get和Post方法的webapi控制器。Get方法在有参数和无参数的情况下都可以正常工作,但是当我尝试向其添加字符串参数时,post会中断。下面是我的代码 路线: config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "{controller}/{id}", defaults: new { id =

我一辈子都搞不清楚这件事。我有一个带有Get和Post方法的webapi控制器。Get方法在有参数和无参数的情况下都可以正常工作,但是当我尝试向其添加字符串参数时,post会中断。下面是我的代码

路线:

        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();

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

更改您的
AuditController
以包含
FromBody
属性:

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

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

cf.

因为您希望参数
test
来自请求主体,所以需要使用
FromBody
属性对其进行修饰。示例:
([FromBody]字符串测试)
。对于其他复杂类型来说,情况并非如此,例如:
Employee
class,它被隐式地认为来自Body

重新饲养获得请求。它应该只与来自查询字符串的测试一起工作
/Audit?test=Mike

以下博客文章提供了有关参数绑定的更多详细信息:


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

您的路由说它有一个名为
id
的参数,但在您的方法中,您传递了一个名为
test
的参数。那是什么?此外,原语类型参数总是试图从Uri中读取,因此post方法无法工作。我真的建议你在ASP.Net主页上学习所有非常好的ASP.NETWebAPI教程!是的。Get方法表示没有{id}参数的路由-因为方法中不存在id参数。当您调用
Audit?test=value
,但不是在
Audit/value
上时,您的测试参数是可选的查询参数之一。你接受的答案总结得很好,但我仍然鼓励你认真学习教程!我添加了FromBody属性,现在它将到达服务,但不幸的是post方法中的“test”变量为null。我也会看一看HttpClient。试着在你体内发送
=TEST
。太棒了!谢谢你对福福福福的见解。为什么?谢谢你,它结束了一个原本烦人的早晨。大部分都是完全不直观的编程决策。