1

一連のサーバーからレポートをアップロードできるようにするために、ASP.NETMVC3のRESTfulWebサービスを作成しています。新しいレポートが作成されたら、クライアントアプリにPUTを実行してもらいたい

レポートのコンテンツをリクエストの本文でXMLとして渡します。

私の質問は、コントローラーでレポートのコンテンツにアクセスするにはどうすればよいですか?HttpContext.Requestオブジェクトのどこかで利用できると思いますが、単体テストができない(?)ため、コントローラーからアクセスするのは気が進まないです。コンテンツを1つ以上のパラメーターとしてコントローラーメソッドに渡すことができるようにルーティングを微調整することは可能ですか?結果はRESTfulである必要があります。つまり、上記のようなURLにPUTまたはPOSTする必要があります。

現在、私のルーティングは次のとおりです。

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

私がURLにPUTしようとしているオブジェクトは次のとおりです。

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

この質問は似ていますが、答えはありません。前もって感謝します

4

1 に答える 1

1

より一般的な HTTP POST の代わりに HTTP PUT を実行するというわずかなしわで、標準のASP.NET MVC モデル バインディング機能を使用するだけでよいようです。この連載記事には、モデル バインディングの使用方法を確認するための優れたサンプルがいくつかあります。

コントローラーのコードは次のようになります。

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 を変更して、レポート タイプに対してこのモデル バインダーを登録します。

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