3

我正在尝试将对象发布到接受复杂类型作为参数但接收的参数为空的 WebAPI 控制器。任何想法为什么?请求正确命中 WebAPI 方法,参数为空。

模型 :

namespace DMAX.BLL.MASReports.Models
{
     public class StatsCriteria
        {
            #region Constructors and Methods
            public StatsCriteria()
            {

            }
            #endregion

            #region Properties and Fields
            private string _masnum;
            private string _notchosen;
            private int _currentPage = 1;
            private bool _isPrint = false;
            private bool _isEmail = false;
            private bool _isAjax = false;
            public string Masnums { get {
                if (!string.IsNullOrEmpty(_masnum)) {
                    _masnum =  _masnum.Replace("'", "");
                    if (!string.IsNullOrEmpty(NotChosen)) {
                        string[] notchosenlist = NotChosen.Split(',');
                        foreach (var notchosen in notchosenlist) {
                           _masnum = this.RemoveNotChosen(_masnum, notchosen);
                        }
                    }
                    return _masnum;
                }
                return null;
            } 
                set { _masnum = value; } 
            }

            public string AgentId { get; set; }
            public string LicenseNum { get; set; }
            public string AgentFullName { get; set; }
            public string HeaderName { get; set; }


            #endregion
        }
    }
}

这是客户端的代码: [ StatsCriteria 是 BLL 项目的一部分,我在 MASReports 项目中引用它]

namespace MASReports.Controllers
{
    public ActionResult Reports(StatsCriteria criteria)
        {
         var client = new HttpClient();
         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
         var response = client.PostAsJsonAsync("http://localhost:52765/api/reports", criteria.Masnums.ToString()).Result;
         return View("CMAReport", response);
        }
}

这是我在 Webapi 中的控制器的签名。 [ StatsCriteria 是 BLL 项目的一部分,我在 ReportsAPI 项目中有对该项目的引用] [ CMAReportVM、CMAReport 是 BLL 项目的一部分,我在 ReportsAPIproject 中有对 BLL 项目的引用]

namespace ReportsAPI.Controllers
{
    public class ReportsController : ApiController
    {
    [HttpPost]
    public CMAReportVM Reports([FromBody] StatsCriteria criteria)
    {
      var cmaReport = Service3.GetCMAReport(criteria.Masnums);
       //Create Map to enable mapping business object to View Model
                 Mapper.CreateMap<CMAReport, CMAReportVM>();
       // Maps model to VM model class 
                 var cmaVM = Mapper.Map<CMAReport, CMAReportVM>(cmaReport);
      reutn cmaVM; 
    }
}
}

// 这是我的路由:

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

这是我的 Web api 的 Gobal.asax

namespace ReportsAPI
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new  QueryStringMapping("json", "true", "application/json"));
         }
    }
}
4

1 回答 1

3

您正在发布一个字符串:

     var response = client.PostAsJsonAsync("http://localhost:52765/api/reports", criteria.Masnums.ToString()).Result;

您的控制器方法需要一个StatsCriteria对象。更改控制器方法的签名以接受字符串或更改后调用。假设控制器方法签名是正确的,帖子应该是这样的:

     var response = client.PostAsJsonAsync("http://localhost:52765/api/reports", criteria).Result;

如果这没有帮助,我建议使用 fiddler 来检查您发布消息时的外观。

于 2013-11-05T07:35:19.620 回答