Asp.net mvc 4 WebApi Put";参数字典包含参数的空条目…“;

Asp.net mvc 4 WebApi Put";参数字典包含参数的空条目…“;,asp.net-mvc-4,self-hosting,Asp.net Mvc 4,Self Hosting,正文: 答复: {"Id":3,"Name":"mmm","Phone":"000 000 0000","Email":"mmm@gmail.com","LastModified":"2012-03-08T23:42:13.8681395+08:00"} 为什么??谢谢 附言: 我无法再现你所描述的问题 型号: config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/

正文:

答复:

{"Id":3,"Name":"mmm","Phone":"000 000 0000","Email":"mmm@gmail.com","LastModified":"2012-03-08T23:42:13.8681395+08:00"}
为什么??谢谢

附言:


我无法再现你所描述的问题

型号:

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

public class Contact
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
    public DateTime LastModified { get; set; }
}
客户:

public class ContactsController : ApiController
{
    public Contact Put(int id, Contact contact)
    {
        return contact;
    }
}
运行客户端时,将发送以下请求:

class Program
{
    static void Main()
    {
        using (var client = new WebClient())
        {
            client.Headers[HttpRequestHeader.ContentType] = "application/json";
            var data = Encoding.UTF8.GetBytes(@"{""Id"":3,""Name"":""mmm"",""Phone"":""000 000 0000"",""Email"":""mmm@gmail.com"",""LastModified"":""2012-03-08T23:42:13.8681395+08:00""}");
            var result = client.UploadData("http://localhost:1405/api/contacts/4", "PUT", data);
            Console.WriteLine(Encoding.UTF8.GetString(result));
        }
    }
}

我从服务器得到正确的结果。因此,我猜您显示的请求不是发送到服务器的实际请求。

我也遇到了同样的问题。查询参数“id”为空,并填写对象“contact”。我认为这是一个模型约束问题。如果在控制器中放置断点,请查看以下表达式:

PUT /api/contacts/4 HTTP/1.1
Content-Type: application/json
Host: localhost:1405
Content-Length: 119
Expect: 100-continue
Connection: Keep-Alive

{"Id":3,"Name":"mmm","Phone":"000 000 0000","Email":"mmm@gmail.com","LastModified":"2012-03-08T23:42:13.8681395+08:00"}
您将看到该值存在于路由数据中;它只是没有被设定在模型上。我有一个ActionFilter,如果我在其中也放了一个断点,我会看到actionContext的ActionArgument有一个键,但是有一个空值


我还在研究…

craigtadlock,感谢您的帮助,并将该漏洞发送给Microsoft。我也有同样的问题。他们都没有工作。作为一个解决办法,我黑了POST来处理PUT。如果我要发布到服务器的对象已经有了ID,则POST代码将其视为具有该ID的PUT。伪代码为:

this.ControllerContext.RouteData.Values["id"]
公共HttpResponseMessage后周期类(MyClass myObject)
{
如果(myObject.ID!=0){
//不要输入代码
}否则{
//你有邮政编码吗
}
}

我尝试了您的代码。但错误是退出。我尝试使用VS11 beta和mvc4 web api。我遇到了同样的问题。你明白了吗?仅供参考,我也使用了VS.NET 11 Beta。我将此作为一个bug发布给Web API团队。这是VS.NET11测试版中确认的错误。它已经在codeplex链接的源代码中修复,但还没有正式版本。实际上,只需从服务器端PUT处理程序中删除ID参数效果更好:public HttpResponseMessage PutMyClass(MyClass myObject){if(myObject.ID==0){//return error}else{if(myObject存在)//不要将代码放在其他位置//返回未找到的代码}
class Program
{
    static void Main()
    {
        using (var client = new WebClient())
        {
            client.Headers[HttpRequestHeader.ContentType] = "application/json";
            var data = Encoding.UTF8.GetBytes(@"{""Id"":3,""Name"":""mmm"",""Phone"":""000 000 0000"",""Email"":""mmm@gmail.com"",""LastModified"":""2012-03-08T23:42:13.8681395+08:00""}");
            var result = client.UploadData("http://localhost:1405/api/contacts/4", "PUT", data);
            Console.WriteLine(Encoding.UTF8.GetString(result));
        }
    }
}
PUT /api/contacts/4 HTTP/1.1
Content-Type: application/json
Host: localhost:1405
Content-Length: 119
Expect: 100-continue
Connection: Keep-Alive

{"Id":3,"Name":"mmm","Phone":"000 000 0000","Email":"mmm@gmail.com","LastModified":"2012-03-08T23:42:13.8681395+08:00"}
this.ControllerContext.RouteData.Values["id"]
public HttpResponseMessage<MyClass> PostMyClass(MyClass myObject)
{
    if( myObject.ID != 0 ){
         //do PUT code
    }else{
         //do POST code
    }
}