接收 xml json 或 form-urlencoded 中的任何数据的控制器操作

Controller action that receives any data in xml json or form-urlencoded

我需要创建一个控制器操作,它可以接受 XML、JSON 或 form-urlencoded 中的任何数据。但是,我无法让它工作。

如果我的操作有一个 Dictionary<string, object> 参数,它适用于 JSON 和 XML 数据,但不适用于 form-urlencoded。如果我的操作有一个 FormDataCollection 参数,它适用于 form-urlencoded 但不适用于 JSON 和 XML。

[HttpPost]
    public HttpResponseMessage Default(FormDataCollection data /*Dictionary<string,object> data*/)
    {
        try
        {
            if (data == null)
                return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = "The request body is empty" });

            //var collection = GetCollection(data); //used when data=Dictionary<string,object>
            var collection = data.ReadAsNameValueCollection();
            var agent = new ScriptingAgentClient();
            var parameters = ServiceAgentParameters.From(collection);

            var result = agent.Run(parameters);
            if (result.Error)
                return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = result.ErrorMessage, Exception = result.Exception });
            if (result.Data != null && result.Data.Count == 1) //result.Data is byte[]
            {
                //TODO: use the right Serializer
                var resultString = Encoding.UTF8.GetString(result.Data[0]);
                var serializer = new JavaScriptSerializer();
                var dict = serializer.Deserialize<Dictionary<string, string>>(resultString);
                return Request.CreateResponse(HttpStatusCode.OK, dict);
            }

            return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = "Unknown error" });

        }
        catch (Exception ex)
        {
            Logger.Error("Error handling request", ex);
            return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = ex.Unwrap().Message });
        }
    }

ScriptingAgentClient 将处理数据,无论数据是什么。

如果这不可能,我如何创建两个具有相同路由的操作,其中一个将处理 XML/JSON 而另一个将处理 form-urlencoded?

请注意,我使用的是 .net40,我无法更改它。值得注意的是,这个网站api 是一个自托管的 api,它将 运行 在 windows 服务中。

我能够阅读 Request 而不是让 WebApi 弄清楚它:

[HttpPost]
    public HttpResponseMessage Default()
    {
        try
        {
            NameValueCollection collection = Request.Content.IsFormData() ?
                Request.Content.ReadAsFormDataAsync().Result :
                GetCollection(Request.Content.ReadAsAsync<IDictionary<string, object>>().Result);

            var parameters = ServiceAgentParameters.From(collection);

            var agent = new ScriptingAgentClient();
            var response = agent.Run(parameters);
            if (response.Error)
                return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = response.ErrorMessage, Exception = response.Exception });

            if (response.Data != null && response.Data.Count == 1) //result.Data is List<byte[]>
            {
               //TODO: use the right Serializer
            var resultString = Encoding.UTF8.GetString(result.Data[0]);
            var serializer = new JavaScriptSerializer();
            var dict = serializer.Deserialize<Dictionary<string, string>>(resultString);
            return Request.CreateResponse(HttpStatusCode.OK, dict);
            }

            return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = "Unknown error" });

        }
        catch (Exception ex)
        {
            Logger.Error("Error handling request", ex);
            return Request.CreateResponse(HttpStatusCode.BadRequest, new { ErrorMessage = ex.Unwrap().Message });
        }
    }