发布模式下的模型绑定问题

时间:2015-01-07 15:05:45

标签: c# .net asp.net-mvc asp.net-mvc-4 asp.net-web-api

我看到我们的一个WebAPI项目出现了一些奇怪的行为。其中一个资源有一个POST动作,它接受一个复杂的.Net对象,其中一个属性是这样的枚举:

public class MyComplexClass {
  public string Prop1 { get; set; }
  public MyEnum Val { get; set; }
}

public enum MyEnum {
   Val1,
   Val2
}

当我从另一个.Net项目调用此端点时,只要我的WebAPI项目已编译完成,它就可以正常工作。部署在调试模式下。我在发布模式下编译它的那一刻,模型绑定开始表现得很奇怪。即使我传入MyEnum或1,我的Val1的值始终为Val2。我似乎无法解释这里发生的事情并且已经用尽了想法。

修改 我有一个帮助程序,它序列化对象并将它们添加到正文并调用WebAPI。我把它称之为类似的东西:

client.Post<MyComplexClass, bool>(new MyComplexClass() { Prop1="Hello"; Val=MyEnum.Val2});

我在项目之间共享模型,在这种情况下我使用相同的模型MyComplexClass,当我序列化它时,当我接受它作为我的Action方法中的参数时:

[HttpPost]
public bool UpdateUserPassword(MyComplexClass request)
{
    Log(request.Val);
}

request.Val的值会有所不同,具体取决于它是在调试还是发布模式下编译的。对于发布,它总是Val1我猜是因为它被默认为0并将其解释为Val1

2 个答案:

答案 0 :(得分:0)

  1. 看看实际通过电线传出的是什么。使用浏览器测试工具或fiddler。
  2. 帮助诊断:明确初始化您的枚举并包含默认的0值。 None=0,Val1=1,Val2=2这将有助于弄清楚它是绑定,序列化还是传输层(应用程序中的内容,但在您的控件之外,如asp.net或iis)。
  3. 如果看起来不错:

    1. 比较已安装和已加载的程序集和版本,Dev to prod。
    2. 比较web.config文件。
    3. 比较machine.config文件
    4. 验证预期部署的程序集是否实际部署。
    5. 确保prod指向部署目标

答案 1 :(得分:0)

因为您没有使用WebAPI2,所以it's safe to assume枚举值未在WebAPI端正确解析。为什么解析在调试模式下工作但在同一台机器上没有在发布模式下工作很奇怪。您可以尝试将枚举值作为字符串传递,然后执行Enum.Tryparse

public class MyComplexClass 
{
    public string Prop1 { get; set; }
    public string Val { get; set; }
}

并在您的控制器中

[HttpPost]
public bool UpdateUserPassword(MyComplexClass request)
{
     MyEnum myenum = MyEnum.Val1; 
     if(Enum.Tryparse(request.Val,true, out myenum)
     {
          Log(myenum);
     }
     else
     {
          // invalid enum value POSTed
     }
}