我对这个问题有一个类似的问题:Deserializing JSON to object with no default constructor in ASP.NET MVC 3但是在MVC4中,引用的解决方案对我不起作用。
基本上,如果我有类似的课程;
public class MyObject
{
public string name = "foo";
public int age = 33;
public MyObject(string n)
{
name = n;
}
}
我尝试从Web API方法返回它;
// GET api/values/5
public **MyObject** Get(int id)
{
return new MyObject("Getted");
}
管道刚刚把我的请求抛到了地板上。它默默失败,出现500错误。现在我可能会期待它会挣扎,但我更喜欢一个例外。目前尚不清楚这是在哪里生成的,但我已尝试在多个点(FilterProvider,ValueProvider,ModelBinder)拦截,我无法看到管道的哪个部分正在抛弃它。
此自定义模型绑定器不甚至可以调用;
public class MyObjectModelBinder : DefaultModelBinder
{
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
return new MyObject("bound model");
}
}
为完整起见,这是在global.asax.cs;
中注册的public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// other stuff...
ModelBinders.Binders.Add(typeof(MyObject), new MyObjectModelBinder());
}
}
奇怪的是,如果我添加一个默认构造函数,它实际上从未被调用过,但如果没有它,Web API管道似乎就无法工作。
确实工作(奇怪);
public class MyObject
{
public string name = "foo";
public int age = 33;
public MyObject()
{
throw new Exception("I am never called! But I must exist");
}
public MyObject(string n)
{
name = n;
}
}
我正在考虑在connect.microsoft.com上提出有关静默失败的问题,但可能必须有解决方法。
任何人都可以解释我做错了什么吗?
答案 0 :(得分:0)
我尝试使用以下代码重新解决您的问题,但它运行正常。你能尝试附上一个复制品吗?
class Program
{
private const string baseAddress = "http://localhost:8080/";
static void Main(string[] args)
{
HttpSelfHostConfiguration configuration = new HttpSelfHostConfiguration(baseAddress);
configuration.Routes.MapHttpRoute("default", "api/{controller}");
HttpSelfHostServer server = new HttpSelfHostServer(configuration);
try
{
server.OpenAsync().Wait();
RunClient();
}
finally
{
server.CloseAsync().Wait();
}
}
static void RunClient()
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(baseAddress);
HttpResponseMessage response = client.GetAsync("api/Test?id=1").Result;
response.EnsureSuccessStatusCode();
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
}
}
public class MyObject
{
public string name = "foo";
public int age = 33;
public MyObject(string n)
{
name = n;
}
}
public class TestController : ApiController
{
// GET api/values/5
public MyObject Get(int id)
{
return new MyObject("Getted");
}
}
你可以为此附上一个复制品吗?
顺便说一句,有一个跟踪包可以用来找出出错的更多信息。http://www.nuget.org/packages/Microsoft.AspNet.WebApi.Tracing/0.3.0-rc
您可以从http://blogs.msdn.com/b/roncain/archive/2012/08/16/asp-net-web-api-tracing-preview.aspx
了解有关如何使用此功能的详情谢谢!
最好的, 红梅