1

我正在创建一个 ASP.NET MVC3 RESTful Web 服务,以允许从一组服务器上传报告。创建新报告时,我希望客户端应用程序执行 PUT 到

在请求的正文中将报告的内容作为 XML 传递。

我的问题是:如何在我的控制器中访问报告的内容?我想它在 HttpContext.Request 对象中的某处可用,但我不愿意从我的控制器访问它,因为不可能(?)对其进行单元测试。是否可以调整路由以允许将内容作为一个或多个参数传递到控制器方法中?结果需要是 RESTful 的,即它必须 PUT 或 POST 到上述 URL。

目前我的路线是:

routes.MapRoute(
    "SaveReport",
    "Servers/{serverName}/Reports/{reportTime",
    new { controller = "Reports", action = "Put" },
    new { httpMethod = new HttpMethodConstraint("PUT") });

有没有办法修改它以将内容从 HTTP 请求正文传递到控制器方法?控制器方法目前是:

public class ReportsController : Controller
{
    [HttpPut]
    public ActionResult Put(string serverName, string reportTime)
    {
        // Code here to decode and save the report
    }
}

我试图 PUT 到 URL 的对象是:

public class Report
{
    public int SuccessCount { get; set; }
    public int FailureOneCount { get; set; }
    public int FailureTwoCount { get; set; }
    // Other stuff
}

这个问题看起来很相似,但没有任何答案。提前致谢

4

1 回答 1

1

似乎您只需要使用标准的ASP.NET MVC 模型绑定功能,但您会使用 HTTP PUT 而不是更常见的 HTTP POST。本系列文章有一些很好的示例来了解如何使用模型绑定。

您的控制器代码将如下所示:

public class ReportsController : Controller
{
    [HttpPut]
    public ActionResult Put(Report report, string serverName, string reportTime)
    {
        if (ModelState.IsValid)
        {
            // Do biz logic and return appropriate view
        }
        else
        {
            // Return invalid request handling "view"
        }
    }
}

编辑:=====================>>>

作为修复的一部分,乔恩将此代码添加到他的评论中,因此我将其添加到其他人的答案中:

创建自定义 ModelBinder:

public class ReportModelBinder : IModelBinder
{
    public object BindModel(
        ControllerContext controllerContext,
        ModelBindingContext bindingContext)
    {
        var xs = new XmlSerializer(typeof(Report));
        return (Report)xs.Deserialize(
            controllerContext.HttpContext.Request.InputStream);
    }
}

修改 Global.asax.cs 以针对 Report 类型注册此模型绑定器:

ModelBinders.Binders[typeof(Report)] = new Models.ReportModelBinder();
于 2012-05-21T13:50:18.950 回答