从 System.Web.Mvc.Controller 端点获取 multipart/form-data

Get multipart/form-data from System.Web.Mvc.Controller endpoint

我有这段简单的代码:

public class TestController : System.Web.Mvc.Controller
{
    /// <summary>
    /// Used for test
    /// </summary>
    [ResponseType(typeof(string))]
    public ActionResult Index()
    {
        try
        {
            // How to get multipart data here?            

            var result = new JsonResult();
            result.Data = ValidateSignedRequest(content);
            return result;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    /// Example signed_request variable from request multipart/form-data
    //private string VALID_SIGNED_REQUEST = "ZcZocIFknCpcTLhwsRwwH5nL6oq7OmKWJx41xRTi59E.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOiIxMjczMzU5NjAwIiwib2F1dGhfdG9rZW4iOiIyNTQ3NTIwNzMxNTJ8Mi5JX2VURmtjVEtTelg1bm8zakk0cjFRX18uMzYwMC4xMjczMzU5NjAwLTE2Nzc4NDYzODV8dUk3R3dybUJVZWQ4c2VaWjA1SmJkekdGVXBrLiIsInNlc3Npb25fa2V5IjoiMi5JX2VURmtjVEtTelg1bm8zakk0cjFRX18uMzYwMC4xMjczMzU5NjAwLTE2Nzc4NDYzODUiLCJ1c2VyX2lkIjoiMTY3Nzg0NjM4NSJ9";

    public bool ValidateSignedRequest(string request)
    {
        // ...
    }
}

我发现 System.Web.Http.ApiController 很容易:

[Route("test")]
[ResponseType(typeof(string))]
[HttpPost]
[AllowAnonymous]
public async Task<IHttpActionResult> Test()
{
    var signedRequest = HttpContext.Current.Request.Params["my_data_key"];
    return Ok(await Task.FromResult(signedRequest));
}

但是这里我不得不使用System.Web.Mvc.Controller,我还没有找到解决办法。

有什么想法吗?谢谢!

我终于找到了我正在寻找的解决方法。我不知道这是否是最好的方法,但它确实有效!

您可以从 Request 的静态实例访问表单数据,如下所示:

[HttpPost]
[ResponseType(typeof(string))]
public ActionResult Index()
{
    try
    {
        if (!Request.Form.AllKeys.Any() || Request.Form["signed_request"] == null)
            throw new ArgumentNullException();

        var result = new JsonResult();
        string signedRequest = Request.Form["signed_request"];
        result.Data = ValidateSignedRequest(signedRequest);
        return result;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}