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
}
}